C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)
目录
static成员
匿名对象(一次性、临时使用...)
友元
友元函数
友元类
内部类
拷贝对象时的一些编译器优化
static成员
面试题:
对于一个自定义的对象来说,不是调用构造函数就是调用拷贝构造函数,所以我们通常是这么做的:
输出后结果为4(count的数量)
但是这样的写法有什么缺陷捏?
1.命名冲突(如上)
2.谁都可以修改(容易误写)
那该怎么做捏?
——静态成员。
要注意count不能使用缺省值,因为它不属于某个对象(静态成员初始化的特殊性)
可以直接调用
同时注意:(静态成员函数可以访问静态成员变量,但不能访问非静态成员)
小例题:
求调用了多少次构造函数?
13次。(数组里有是个对象)
再来一道题:
class Sum
{
public:
Sum()
{
_sum += _i;
++_i;
}
static int GetSum()
{
return _sum;
}
private:
static int _i;
static int _sum;
};
int Sum::_i = 1;
int Sum::_sum = 0;
class Solution {
public:
int Sum_Solution(int n) {
//Sum a[n];
Sum* ptr = new Sum[n];
return Sum::GetSum();
}
匿名对象(一次性、临时使用...)
使用场景:
返回一个匿名对象:
友元
友元函数
访问私有的方式:
1.在public里写Getyear(),Getmonth(),Getday()这样的函数
2.利用友元
例:
友元类
例:
内部类
先来用一道程序阅读题理解一下吧?
以下代码的输出结果是多少捏?
公布结果:
aa里面只有自己的成员
所以:
修改:
但如果B是私有的,仍然不能访问
独立:指的是B的空间是独立的。但受类域的限制,受访问限定符的限制。
注意:内部类天生就是原类的友元。(也就是说,可以直接访问原类的私有)
拷贝对象时的一些编译器优化
1.构造+拷贝构造------>优化为:直接构造
例:
(注意第三行的析构是aa的析构)
引用传参不优化
例:
2.拷贝构造+拷贝构造------>优化为:一个拷贝构造
例:
3.构造+拷贝构造+拷贝构造------>优化为:一个构造
例:
......
所以,以后写代码是不是要采取下图中上面的那种写法捏?