【C++】深入探索类和对象:初始化列表及其static成员与友元(二)https://developer.aliyun.com/article/1617302
六、内部类(了解即可,基本没人使用)
概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类成员。外部类对内部类没有优越的访问权限。
注意:内部类天生就是外部类的友元类(但是外部类不是内部类的友元),参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。
class A { private: int h; public: class B { public: void Print(const A& a) { cout << a.h << endl; } private: int h2; }; }; int main() { A::B b; b.Print(A());//A()构造函数,在通过引用接受,调用成员 return 0; }
内部类小结:
- 内部类可以定义在外部类的public、protected、private都是可以的
- 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象类名
sizeof
(外部类)=外部类,跟内部类没有任何关系- 内部类这个类收到外部类的类域的限制
- C++不喜欢使用内部类,类独立更好使用。
七、匿名对象
字面意思不写对象名,在使用该对象方便一点点
class A { public: A(int a = 0) :_a(a) { cout << "A(int a)" << endl; } ~A() { cout << "~A()" << endl; } private: int _a; }; class Solution { public: int Sum_Solution(int n) { //... return n; } }; int main() { A(); A aa2(2); //匿名对象在这种场景下就很好用,当然还有一些其他场景 Solution().Sum_Solution(10); return 0; }
匿名对象小结:
- 虽然不能
A aa1()
去定义对象(编译器无法识别),但是可以A()定义匿名对象- 匿名对象是不用取名字
- 匿名对象的生命周期只有这一行,下一行就会自动调用析构函数
八、拷贝对象时编译器优化
在传值和传返回值的构成中,一般编译器会做一些优化,减少对象的拷贝,这个一些场景下还是非常有用的。(不同平台就有不同的结果,需要看编译器优化情况和变量大小)
结果:图一:
构造+拷贝
图二:
构造+拷贝+拷贝
优化为构造+拷贝
,这里ret
在f3
函数结束前,使用aa
拷贝ret
图三:
构造+拷贝+拷贝
优化构造
,编译器很聪明的,直接优化成构造给值ret
。
- 类A提供了显式的构造函数和拷贝构造函数,编译器可能会避免执行一些默认的优化,就按照提供的函数处理,而不会尝试使用更高效的默认实现。
- 如果没有提供显式构造和拷贝函数,编译器选择使用默认生成的函数可能进行优化,优化可以减少不必要的构造函数调用,提高代码的效率。
九、再次理解类和对象
在类和对象阶段。类时对某一类实体(对象)来进行描述的,描述该对象具有那些属性、方法、完成后就形成了一种新的自定义类型,才能该自定义类型就可以实例化具体的对象。
关于一道静态成员变量题目
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句,位运算。
class Sum { public: Sum() { _i=_i+1; _sum+=_i; } static int Get_sum() { return _sum; } private: static int _i; static int _sum; }; int Sum:: _i; int Sum:: _sum; class Solution { public: int Sum_Solution(int n) { Sum a[n];//看调用多少次构造函数 return Sum::Get_sum(); } };
以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二呀C++笔记,希望对你在学习C++语言旅途中有所帮助!