深入理解c++成员函数

1、const成员函数:
在成员函数后面加const,const修饰this指针所指向的对象,也就是保证调用这个const成员函数的对象在函数内不会被改变

思考以下几种场景
1. const对象可以调用非const成员函数和const成员函数吗? x
2. 非const对象可以调用非const成员函数和const成员函数吗? 对
3、const成员函数内可以调用其它的const成员函数非const成员函数吗?
前对 后x
4、非const成员函数内可以调用其它的const成员函数非const成员函数吗?对

权限可以被缩小,但是不可以被放大。const权限小,非const权限大

    int  a = 10;
    int *p1 = &a;//值可以被改变
    const int *p2 = &a;//把a的地址给给p2,通过改变p指向的内容改变值
    int const*p3 = &a;//同上

    p1 = p2; //不可以
    p2 = p1;//可以      权限问题
    ///////////////////////////////////
    //p1 、p2、p3都可以被改,p4,p5不能被改
    int *const p4 = &a;//p4不能被改
    const int* const p5 = &a;//都不能被改

2、inline(内联)
以inline修饰的函数叫做内联函数,编译时C++编译器会调用内联函数的地方展开,没有 函数压栈的开销,内联函数提升程序运行的效率
1. inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的的函数不适宜使用内联。
2. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉 内联。
3. inline必须函数定义放在一起,才能成为内联函数,仅将inline放在声明前是不起不作用的。
4. 定义在类内的成员函数默认定义为内联函数。

问题–C++建议以const/枚举/内联去替代宏,为什么?

优点
1. 增强代码的复用性。
2. 提高性能。
宏也有很多缺点:
1. 不方便调试宏。(因为预编译阶段进行了替换)
2. 导致代码可读性差,可维护性差,容易误用。
3. 没有类型安全的检查。

3、友元函数: 在C++中友元函数允许在类外访问该类中的任何成员,就象成员函数一样,友元函数用关键字friend说明。
1. 友元函数不是类的成员函数。
2. 友元函数可以通过对象访问所有成员,私有和保护成员也一样

友元是突破访问限定符的一种函数

#include<iostream>
#include<stdlib.h>
using namespace std;
class Date
{
    friend  bool operator<(Date& aa1, Date& aa2);//去掉则不能访问类内的成员函数,b要访问a必须在a中声明b是a的朋友
public:
    Date(int a1, int a2)
        : _a1(a1)
        , _a2(a2)
    {}

private:
    int _a1;
    int _a2;
};
bool operator<(Date& aa1, Date& aa2)
{
    return aa1._a1 < aa2._a2;
}
int main()
{
    Date(1, 2);
    Date(2, 3);


    system("pause");
    return 0;
}

友元类也是相同的声明方法B要访问A,就必须在A中声名B;

class Time 
{     
// Date是Time 的友元,所以 Date可以访问Time的所有成员。     
**friend class Date;** 
private :     
int _hour ;     
int _minute ;     
int _second ;
 };
class Date 
{ 
public :     
void Display ()    
{          
cout<<"year:" <<_year<< endl;          
cout<<"month:" <<_month<< endl;          
cout<<"day:" <<_day<< endl;// 定义为友元类后,可以访问Time类对象的所有成员          
cout<<"hour:" <<_t. _hour<<endl ;          
cout<<"minute:" <<_t. _minute<<endl ;          
cout<<"second:" <<_t. _second<<endl <<endl;  
}
private :     
int _year ;     // 年     
int _month ;    // 月     
int _day ;      // 日
Time _t ;
};
void Test () 
{     
Date d1 ;     
d1.Display (); 
} 

4、static成员函数:
类的静态成员
1. 类里面static修饰的成员,成为静态类成员。
2. 类的静态成员是该类型的所有对象对象所共享。
注意静态成员函数没有隐含this指针参数,所以可以使用类型::作用域访问符直接调用静态成员函数。
代码如下:

#include<iostream>
#include<stdlib.h>
using namespace std;
class Date
{
public:
    Date()
    {
        cout << "Date()" << endl;
        count++;
    }
    void Display()
    {
        cout << "年:" << _year << endl;
        cout << "月" << _month << endl;
        cout << "日" << _day << endl;
    }
    static void printcount()
    {
        cout << "Date count:" << count<<endl;
    }
private:
    int _year;
    int _month;
    int _day;
private:
    static int count;//静态成员变量,用于统计创建个数
};
int Date::count = 0;
void test()
{
    Date d1, d2;
    //访问静态成员
    Date::printcount();
}
int main()
{
    test();
    system("pause");
    return 0;
}

这里写图片描述

1)、静态成员函数不可以访问非静态的成员
2)、 非静态的成员函数可以访问静态成员
5、

Test1中调用了 _ 次AA的拷贝构造函数 _ 次AA的赋值运算符函数的重载。 Test2中调用了
次AA的拷贝构造函数,_ 次AA的赋值运算符函数的重载。 Test3中调用了 次AA的拷贝构造函数, 次AA的赋值运算符函数的重载。 class AA {}; AA f (AA a) { return a ; } void Test1 () { AA a1 ; a1 = f(a1); } void Test2 () { AA a1
; AA a2 = f(a1); }

void Test3 () { AA a1 ; AA a2 = f(f(a1)); }
答案:
1) 2 1
2) 2 0
3) 3 0

这里写图片描述

猜你喜欢

转载自blog.csdn.net/adzn1/article/details/79773420