燕郊网站建设,如何把网站点击连接到百度商桥,wordpress 弹窗 网页,云主机 免费引言#xff1a; 北京时间#xff1a;20223/2/9/22:20#xff0c;距离大一下学期开学还有2天#xff0c;昨天收到好消息#xff0c;开学不要考试了#xff0c;我并不是害怕考试#xff0c;考试在我心里#xff0c;地位不高#xff0c;可能只有当我挂了#xff0c;才能…引言 北京时间20223/2/9/22:20距离大一下学期开学还有2天昨天收到好消息开学不要考试了我并不是害怕考试考试在我心里地位不高可能只有当我挂了才能意识到吧哈哈哈我害怕的是为了要去复习而没有什么时间去更新我的博客了害怕C中的肉都给别人抢走了害怕连汤都喝不上所以此时当我知道了考试可以延后两个星期的时候我是开心的心情异常的好对了此时这里记录一下就在刚刚我报名了我大学生活中的第一个组织好像叫什么图书馆助手的但是还没被选上结果在之后的博客中你们一定可以看到此时我们带着对未来的美好憧憬和好心情开始学习我们的C吧 回顾类和对象
进入新的知识的学习通过上篇博客此时我们把类和对象的相关知识都搞定的差不多了此时我们就要开始学习类和对象之后的知识了如STL库之类的所以在我们进入到新的学习中去的时候我们把上篇博客的内容先做一个回顾并且为我们即将要学的新内容做一定的铺垫这样就可以使我们的C路途变得更加的光明。
所以此时我们就用一个题目来复习一下static的使用和匿名对象的使用 如题求1234……n要求使用静态成员变量的方法 ok看到这个题目我们知道我们肯定见过也实现过只是我们使用的方法是循环或者递归而已所以我们此时应该怎样用static来实现呢 如图中代码 看到上述的代码我们可以浅浅的把静态成员变量和静态成员函数匿名对象的使用给小小的复习一下此时我们深入看一下什么是静态成员变量我们从一个问题出发。 问题为什么静态成员变量要在类外初始化不可以在类里面进行初始化呢 原因当我们使用了static在类外定义一个变量的时候此时该变量就已经在静态区存储好了所以当我们使用类创建了多个对象的时候其实本质上这些对象使用的都是同一块内存中的数据。 具体原理就是静态成员提供了一个同类对象的共享机制所以该类所定义的对象共享同一个静态成员变量无论定义多少个对象他们的static成员变量都是同一个所以静态成员变量属于整个类不属于某个对象得出这个结论因为不属于某个对象所以就不可以在类中进行初始化反向理解就是如果你初始化了此时这个静态成员变量就属于该对象了所以不可以给缺省值因为给了缺省值这个值就是用于初始化列表给静态成员变量定义的所以间接是进行了在类中进行静态成员变量的定义并且又由于在我们实例化对象的时候静态成员变量也是在这个对象空间中如果此时我们进行不止一个该类对象的实例化然后此时对每个类对象中的静态成员变量进行定义就会因为此时的静态成员变量是在静态区的只有唯一的一块空间导致重复定义的问题或者竞争定义的问题所以编译器是不允许这样的情况的所以总的来说静态成员变量要事先在类的外部进行定义不允许在类的内部进行定义。
铺垫光明之路
上述问题有助于我们很好的把static这块的知识搞定所以接下来我们就开始为我们的C光明之路铺垫一下学习了解一些有关编译器系统和类中的特殊知识为类和对象过度到新知识架好桥梁Come on.
类中类的认识 并且此时内部类天生就是外部类的友元哦了解就行平时很少用的。
编译器内部优化
该编译器的优化一般就是针对于那种构造完就拷贝构造的情况例A a 1;会先构造出一个A类型的临时变量然后再把该临时变量拷贝构造给a这就涉及了构造和拷贝构造连续进行此时我们的编译器就会对其进行优化所以我们大致以这个方向进行系统优化的学习但前提是你的编译器当中有优化这个操作的执行不是所有的编译器都是有自动优化这个功能的。
传值传参中的系统优化 如下代码
#includeiostream
using namespace std;class A
{
public:A(int a 1){cout 证明调用构造函数 endl;}A(const A aa 1){cout 证明调用拷贝构造函数 endl;}~A(){cout 证明调用了析构函数 endl;}
private:int _a;};
void Function1(A aa1)
{}
void Function2(const A aa)
{}int main()
{//A aa1 1; //构造拷贝构造 - 优化为直接构造前提是在同一个表达式中//Function1(aa1); //此时这个只会调用一次的拷贝构造//Function1(2); //构造拷贝构造 - 优化为直接构造前提是在同一个表达式中//Function1(A(3)); //构造拷贝构造 - 优化为直接构造前提是在同一个表达式中A aa1 1; //重点因为这个不是进行直接传参所以此时涉及临时变量只有涉及到传参时才不会有临时变量而是直接使用形参这个局部变量Function1(aa1); //此时如何理解析构函数的调用因为此时我用aa1就拷贝了aa,aa是该函数的一个局部变量是一个形参所以当函数结束之后aa就要销毁此时不是临时变量是局部变量这里要区别析构函数对main函数中对象的销毁和对其它函数中局部变量的销毁Function1(2); //这个也是因为直接进行传参被编译器优化成了直接构造所以是直接使用形参局部变量所以函数调用完之后需要调用析构函数进行清理工作Function1(A(3)); //这个也是因为直接进行两次传参没有涉及临时变量所以使用了两次的形参传递所以调用两次析构函数return 0;
}传引用传参的系统优化 代码及注释
#includeiostream
using namespace std;class A
{
public:A(int a 1){cout 证明调用构造函数 endl;}A(const A aa 1){cout 证明调用拷贝构造函数 endl;}~A(){cout 证明调用了析构函数 endl;}
private:int _a;};
void Function2(const A aa)
{}
int main()
{A aa1 1;Function2(aa1);//此时这个是传引用传参所以根本不涉及构造函数和拷贝构造函数所以无优化简单理解就是把自己直接当作形参Function2(2); //这个就是直接构造一个A类型的变量然后传给参数此时那个参数就是这个构造出来的变量的别名所以有构造和析构所以这个是不需要优化的因为根本就没有拷贝构造Function2(A(3));//第一次传参同理需要临时变量第二次传参不涉及临时变量return 0;
}传返回值的系统优化
代码注释如下
#includeiostream
using namespace std;class A
{
public:A(int a 1){cout 证明调用构造函数 endl;}A(const A aa 1){cout 证明调用拷贝构造函数 endl;}~A(){cout 证明调用了析构函数 endl;}
private:int _a;};A Function3()
{A aa;//此时重点讲的是构造和拷贝构造不在同一行的情况之下是不涉及优化的只有在同一行才有优化此时该行就是构造return aa;//构造好之后返回就是拷贝构造了并且此时就涉及到了临时变量的返回有常属性并且虽然此时是临时变量但是因为上面的aa是局部变量所以也需要一次析构
}
A Function4()
{return A();//总匿名对象返回是更好的编译器优化更好
}
int main()
{Function3();//不优化一个构造一个拷贝构造cout ___________________________________ endl;A aa1 Function3();//优化从一个构造两个拷贝构造到一个构造一个拷贝构造cout ___________________________________ endl;Function4();//优化此时就是一个步骤所以就是直接构造cout ___________________________________ endl;A aa2 Function4();//优化此时就是一个return 0;
}总接收返回值对象尽量拷贝构造接收不要赋值接收函数中返回对象时尽量返回匿名对象并且函数传参是尽量使用const和引用接收函数参数。 总结北京时间2023/2/10/20:09明天开学上述内容我知道有一些的摆烂没什么时间写也不怎么想写了所以撤了收拾东西去了各位学校见。