网站设计制作厂家有哪些,wordpress背景音乐,云服务器搭建网站教程,中国空间站官网(static成员 explicit 友元函数 内部类 编译器优化#xff09; 一.static 成员#xff1a;1.概念引入#xff1a;1-1#xff1a;定义全局变量记录个数#xff1f; 2.如果有多个类需要分开去记录类对象的个数#xff1f;2-1#xff1a;可不可以声明成员变量解决#… (static成员 explicit 友元函数 内部类 编译器优化 一.static 成员1.概念引入1-1定义全局变量记录个数 2.如果有多个类需要分开去记录类对象的个数2-1可不可以声明成员变量解决2-2使用static成员变量1.概念2.静态成员函数3优点 3.总结4.一个题目思路一两个问题 二.explicit:1.概念引入2.概念提升支持没有缺省值 3.explicit的作用1,概念2.使用 三.友元1.友元函数总结 2.友元类1.概念 四内部类1. 概念2. 特性3.应用思路二 五拷贝构造时的优化1.概念2.引入情景一1.问题 情景二情景三情景四 一.static 成员
1.概念引入 1-1定义全局变量记录个数 1.我们首先想到的方法是定义一个全局的变量去记录创建类对象的个数我们定义一个count去在对象构造的时候进行。 2.经过下面的图片可以看到在全局count被多次定义所以我们可以通过命名空间把count这个全局给封装一下 2.如果有多个类需要分开去记录类对象的个数
2-1可不可以声明成员变量解决 我们可以声明一个成员变量去在构造的过程中去记录个数创建类对象的个i数 答是不可以的因为每一个成员变量都被分配了一个空间。不可能产生去记录个数的作用 2-2使用static成员变量
1.概念 1.static成员变量是声明在类中的是在全局初始化(定义)的。 2.静态成员为所有类对象所共享不属于某个具体的对象存放在静态区 2.我们想要获得在类里面声明的_count 可以解除类域和访问限定符的限制做到可以直接打印个数构造的个数 3.我们加上一个域和访问限定都是防止外面可以随便访问类的成员进行随意的修改所以这里可以考虑使用类的成员函数去获取通过类和访问限定修饰的_count。 4.正常寻找数据是向上寻找在当前函数域中找再到全局中去找如果不加域访问限定符正常是不会到类中寻找。这也是命名空间存在的意义 1.使用用类的成员函数我们是需要一个类的对象的不然调用不到这个成员函数 2.匿名代码优化 2.静态成员函数 1.我们上面的操作都是通过创建一个对象去通过创的对象进行函数的调用获取个数并且还需要减去1.因为多创建了一个对象用来计数。 2.静态成员函数是没有指针的只需要进入类域就可以访问到静态成员函数。这个时候静态成员函数是全局的函数但是被这个类所占有需要通过域访问限定符进行访问 3.静态成员函数不可以访问非静态的成员变量因为静态成员函数是没有this指针的 3优点
通过静态成员函数和静态成员变量可以在完美的计算个数的同时不会影响类原来的任何操作。
3.总结 静态成员为所有类对象所共享不属于某个具体的对象存放在静态区静态成员变量必须在类外定义定义时不添加static关键字类中只是声明类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问静态成员函数没有隐藏的this指针不能访问任何非静态成员静态成员也是类的成员受public、protected、private 访问限定符的限制 6.静态成员函数和静态成员变量本质都是全局的只是受到类的限制。 4.一个题目 题目链接
思路一 我们看一下这个题目基本上所有通过运算的方法都被限制完全了没有什么方法可以解决了但是我们经过上面的学习是不是可以通过构造N次去模拟实现循环N次再通过静态成员函数和静态成员变量解决这个问题呢 class A{
public:A(){_sum_i;_i;}static int Get_Sum(){return _sum;}
private:static int _i;static int _sum;
};int A::_i1;
int A::_sum0;class Solution {
public:int Sum_Solution(int n) {A arr[n];return A::Get_Sum(); }
};两个问题 静态成员函数可以调用非静态成员函数吗 答不可以 静态成员函数没有this指针不可以调用非静态成员函数并且不可以调用非静态成员变量。 非静态成员函数可以调用类的静态成员函数吗 答可以 静态成员函数只是收到类域的限制我们想要使用静态成员函数需要指定类域。
二.explicit:
1.概念引入 我们观察上面的代码为什么发生隐式类型转换呢
答关于内置类型不相同的之间可以发生隐式类型转换。我们这里是内置类型和自定义类型之间发生的隐式类型转换。是因为有单参数的构造函数支持发生了隐式类型的转换
2.概念提升 既然存在支持单参数的构造函数那么存不存在支持多参数的构造函数呢 支持 我们发现其实是支持多参数的隐式类型转换但是我们month和day都有缺省值在这个地方本质还是一个单构造函数支持的隐式类型转换 没有缺省值
C11 支持进行列表初始化 3.explicit的作用
1,概念
1.使用加在构造函数函数名之前可以阻止上面的这个隐式类型转换的发生 2.作用使用explicit相当于把这个构造函数给标记为了显示的构造函数这个构造函数就不会支持隐式类型的转换了 3.强制类型转换是管不了的 2.使用 通过模板创建了一个Date类型的一个链表调用push_back 函数。三个方法可以进行尾插 1.方法一正常创建一个对象去进行插入。 2.方法二通过匿名对象进行插入。 3.方法三通过隐式类型转换支持的一个尾插数据 4.在大多数情况下都是允许隐式类型转换的发生的在少部分情况下不允许隐式类型转换发生的 三.友元
1.友元函数
问题现在尝试去重载operator然后发现没办法将operator重载成成员函数因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置 this指针默认是第一个参数也就是左操作数了。但是实际使用中cout需要是第一个形参对象才能正常使用。所以要将operator重载成全局函数。但又会导致类外没办法访问成员此时就需要友元来解决。operator同理。
总结
友元函数可访问类的私有和保护成员但不是类的成员函数 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明不受类访问限定符限制 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同
2.友元类
1.概念 友元类的成员函数都可以是另一个类的友元函数并且可以访问非公有的成员变量。 友元关系是单向的不具有交换性 下面这个例子B是A的友元说明A把B当成朋友。B就可以随便使用A的成员函数和访问A类的私有。但是B不一定把A当作朋友所以A不可以随便访问B的成员函数或者私有成员变量。
友元关系不能传递 如果C是B的友元 B是A的友元则不能说明C是A的友元。
友元关系不能继承 四内部类
1. 概念
如果一个类定义在另一个类的内部这个【内部】的类就叫做【内部类】。内部类是一个独立的类它不属于外部类更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。
注意内部类就是外部类的友元类参见友元类的定义内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。
2. 特性
内部类可以定义在外部类的public、protected、private都是可以的。注意内部类可以直接访问外部类中的static成员不需要外部类的对象/类名。sizeof(外部类)外部类和内部类没有任何关系。A和B的关系他们都是一个普通类。只是关系比较密切B受到A的访问限定符的限制。B作为A的友元可以随便访问成员函数或者成员变量。本质多了一个封装多了一个友元
3.应用 题目链接
思路二
1.思路一有可能出现问题在solution创建新的对象导致数值错误我们使用下面的优化方法就不可能出现这样的问题
2.可不可以把用来构造记录个数的类作为solution的内部类定义solution的私有为_i _sum,通过内部类是外部类的友元操作到的外部类的成员变量。外部类的成员函数自然可以访问到静态成员变量。
class Solution {
public:class A{public:A(){_sum_i;_i;}static int Get_Sum(){return _sum;}};int Sum_Solution(int n) {A arr[n];return A::Get_Sum(); }private:static int _i;static int _sum;
};int Solution::_i1;
int Solution::_sum0;五拷贝构造时的优化
1.概念
在传参和传返回值的过程中一般编译器会做一些优化减少对象的拷贝这个在一些场景下还是非常有用的。 2.引入
情景一 1.问题
因为理论上发生了隐式类型的转换所以会发生一次构造和一次拷贝构造但是根据打印结果显示只发生了一次构造和一次析构
答因为编译器进行了优化条件是必须在一行进行构造拷贝构造
情景二
进行构造和拷贝构造不在同一行通过代码执行发现编译器没有对这样的操作进行优化 情景三 补充整形值是具有常性的所以构造函数的参数是const类型的参数 情景四
拷贝构造拷贝构造—》拷贝构造