C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)

目录

static成员 

匿名对象(一次性、临时使用...)

 友元

友元函数

 友元类

内部类

拷贝对象时的一些编译器优化


static成员 

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第1张图片

 面试题:

对于一个自定义的对象来说,不是调用构造函数就是调用拷贝构造函数,所以我们通常是这么做的:

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第2张图片

 C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第3张图片

 输出后结果为4(count的数量)

 但是这样的写法有什么缺陷捏?

1.命名冲突(如上)

2.谁都可以修改(容易误写)

那该怎么做捏?

——静态成员。

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第4张图片

 要注意count不能使用缺省值,因为它不属于某个对象(静态成员初始化的特殊性

 C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第5张图片

 可以直接调用

同时注意:(静态成员函数可以访问静态成员变量,但不能访问非静态成员)C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第6张图片

 小例题:

求调用了多少次构造函数?

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第7张图片

13次。(数组里有是个对象) 

再来一道题:

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第8张图片

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();
	}

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第9张图片


匿名对象(一次性、临时使用...)

使用场景:

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第10张图片

 返回一个匿名对象:

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第11张图片


 友元

友元函数

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第12张图片

 访问私有的方式:

1.在public里写Getyear(),Getmonth(),Getday()这样的函数

2.利用友元 

例:

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第13张图片

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第14张图片

 友元类

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第15张图片

 例:

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第16张图片


内部类

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第17张图片

 先来用一道程序阅读题理解一下吧?

以下代码的输出结果是多少捏?

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第18张图片

公布结果:

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第19张图片

aa里面只有自己的成员

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第20张图片 所以:

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第21张图片

 修改:

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第22张图片

 但如果B是私有的,仍然不能访问

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第23张图片

 独立:指的是B的空间是独立的。但受类域的限制,受访问限定符的限制。

注意:内部类天生就是原类的友元。(也就是说,可以直接访问原类的私有)


拷贝对象时的一些编译器优化

1.构造+拷贝构造------>优化为:直接构造

例:

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第24张图片 (注意第三行的析构是aa的析构)

 引用传参不优化

例:

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第25张图片

 2.拷贝构造+拷贝构造------>优化为:一个拷贝构造

例:

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第26张图片

 3.构造+拷贝构造+拷贝构造------>优化为:一个构造

例:

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第27张图片 

 ......

所以,以后写代码是不是要采取下图中上面的那种写法捏?

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第28张图片

C++ 类与对象part3(static成员、匿名对象、友元、内部类、编译器的优化)_第29张图片 

 

 

你可能感兴趣的:(C++,c++,开发语言)