当前位置: 首页 > news >正文

网站建设实训报告wordpress出境游

网站建设实训报告,wordpress出境游,做网站后的总结,织梦网站排行榜目录1.初始化列表1.1构造函数赋值1.2初始化列表格式#xff1a;编译器执行的顺序#xff1a;特性#xff1a;1.3explicit关键字类型替换过程多参数构造函数类型替换#xff08;C11#xff09;2.static成员编程题3.匿名对象4.友元4.1友元函数4.2友元类5.内部类6.拷贝对象时… 目录1.初始化列表1.1构造函数赋值1.2初始化列表格式编译器执行的顺序特性1.3explicit关键字类型替换过程多参数构造函数类型替换C112.static成员编程题3.匿名对象4.友元4.1友元函数4.2友元类5.内部类6.拷贝对象时的一些编译器优化6.1传值传参6.2传值返回7.理解类和对象1.初始化列表 1.1构造函数赋值 创建对象时编译器会调用构造函数来为对象中的成员变量一个合适的初始值。 但不是所有的成员变量都可以在构造函数内获得初始值的如下代码 运行后给出如下错误 这是因为被const修饰的变量只能在定义的时候初始化那哪里是成员变量定义的地方 答成员变量在初始化列表 中定义并初始化。 如下图是我们经常写的类 在类内private访问限定符下的成员变量只是成员变量的声明 在对象创建时也叫定义对象会调用类内的构造函数默认构造函数或非默认构造函数其中在 成员变量的定义 的位置也叫做初始化列表 下面会讲现在知道这个位置即可成员变量在这个地方定义的如果成员变量中有被const修饰的可以在此处初始化。 了解了这些我们在来看一下初始化列表的具体特性和功能。 1.2初始化列表 格式 初始化列表在构造函数默认构造函数或非默认构造函数下以一个冒号开始 接着是一个以 逗号分隔的数据成员列表 每个“成员变量 ”后面跟一个放在括号中的初始值或表达式。 class Date { public:Date():_year(1),_month(1),_day(1){} private:int _year;int _month;int _day; };编译器执行的顺序 之所以在这个位置以该格式写的代码被称为初始化列表一是因为在这里成员变量完成定义其次是编译器在对象创建后调用构造函数也是先执行初始化列表 将对应的成员变量初始化后在执行构造函数体内的代码。 如下图 如果我们没有实现初始化链表编译器会默认实现因为对于成员变量必须要定义而初始化列表就是定义成员变量的只是这样初始化后的成员变量值为随机值需要看它的构造函数或其他函数是否为其赋值。 但要注意我们没有实现初始化列表遇到被const修饰的成员函数或其他特殊的情况下面会讲可就运行不了了。 结论 尽量使用初始化列表。 成员变量 在类中声明次序 就是其初始化列表中的初始化顺序 与其在初始化列表中的先后次序无关。 如下图调换初始化列表的顺序可以观察到程序的执行顺序为_year、_month、_day与声明顺序相同。 特性 每个成员变量在初始化列表中只能出现一次 初始化只能初始化一次第二次就成复制了赋值是在构造函数体内完成。 类中如果包含以下成员必须放在初始化列表位置处初始化。 引用成员变量 引用的特点就是在定义时必须赋值。 const成员变量 被const修饰的变量如果不在定义时初始化其他时候无法改变它的值那该变量的存在就没有价值。 自定义类型成员且该类中没有默认构造函数时 没有默认构造函数意味着有非默认构造函数编译器无法在其定义时自动初始化该成员变量只能通过我们自己传值调用其非默认构造函数。 class A { public:A(int a): _a(a){} private:int _a; };class B { public:B(int a, int ref): _Aobj(a), _ref(ref), _n(1){} private:A _Aobj; //没有默认构造函数int _ref; //引用const int _n; //const };注意 尽量使用初始化列表如果不能用初始化列表初始化的成员变量如需要开辟空间的情况等等在构造函数体内完成即可不要只盯着初始化列表。 拓展 C11中规定内置类型成员变量在类中声明时可以给默认值。 这里的默认值是缺省值不是初始化比方说对于被const修饰的成员变量如果在声明时给出默认值并在初始化列表初始化最后以初始化列表为主若是初始化列表没有初始化则以默认值为主 class Date { public:Date(): _year(1){cout _year endl;} private:const int _year;int _month;int _day; }; class A { public:A(){cout _year endl;} private:const int _year 2; };int main() {Date today;A a;return 0; }1.3explicit关键字 构造函数不仅可以构造与初始化对象对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数统称单参数默认构造函数还具有类型替换的作用。 若不想实现这种功能在构造函数前增加关键字explicit即可 类型替换过程 接下来我们一步步探索这个现象 我们先来看如下代码 int main() {int a 1;double b a; //隐式类型转化return 0; }这个代码是可以运行成功的变量a在为b赋值时发生隐式类型转化首先生成了一个const double类型的临时变量临时变量有常性 变量a将值赋给这个临时变量由临时变量将值赋给变量b 了解了临时变量的存在在来看下面的一段代码 class A { public:A(int a): _a(a){cout A(int a) endl;}private:int _a; };int main() {const A b 1;return 0; }我们看到代码成功运行并输出而想要为引用初始化需要为其赋一个同类型的变量所以const A b 1;中先创建一个临时的A类型对象临时的对象也有常性所以引用需要使用const修饰并使用1为其成员变量赋值这个过程调用构造函数接着使对象b成为零时对象的引用证明这么做必然会产生一个临时的变量。 到这里类型替换的过程也就呼之欲出了不过结果可能和大家想象的不一样。 看如下代码 class A { public:A(int a): _a(a){cout A(int a) endl;}A(const A aa): _a(aa._a){cout A(const A a) endl;} private:int _a; };int main() {A a 1;//等价于: A a(1);return 0; }按照正常的想法通过构造函数创建一个临时对象在通过拷贝构造函数创建对象a而现在只调用了构造函数这是为什么 这是编译器帮我们做出的优化正常的过程是构造-拷贝 a但C觉得这么做有些繁琐便取消了拷贝的过程直接通过1来构造对象a 等价于A a(1)。 在C发展之初这些优化是没有的但随着发展编译器不断进化开始减少很多没必要的步骤慢慢做出优化同时对语法的要求更高保证优化后对编译没有影响。一般新一点的编译器会有优化老的编译器没有。 多参数构造函数类型替换C11 对于多参数的构造函数C98是不支持进行类型替换的但在C11对这一块进行拓展支持其多参数进行这一操作。需在进行多参数替换时使用大括号包含需要传的参数即可。如下 注意若不想进行替换操作在构造函数前增加explicit关键字即可 2.static成员 声明为static的类成员 称为 类的静态成员 用static 修饰的 成员变量 称之为 静态成员变量 用 static修饰 的 成员函数 称之为 静态成员函数 。静态成员变量一定要在类外进行初始化。 其特性如下 静态成员 为 所有类对象共享 不属于某个具体的对象存放在静态区静态成员变量 必须在类外定义定义时不添加static关键字类中只是声明类静态成员即用 类名::静态成员 或者 对象.静态成员 来访问静态成员函数 没有 隐藏的 this指针不能访问非静态成员静态成员也是类的成员受public、protected、private 访问限定符的限制 了解了特性我们需要注意以下几种情况 创建类的指针对象设置为空它可以访问类中的静态成员和静态函数 class A { public:static void Print(){cout _a endl;} private:static int _a; };int A::_a 0;int main() {A* a nullptr;a-Print();return 0; }静态成员为所有类对象共享使用空指针调用不涉及指针自生甚至在静态成员函数内不会有this指针不会造成编译错误。 静态成员函数不能调用非静态成员函数 静态成员函数内没有this指针无法调用除静态成员外的其他成员 非静态成员函数可以调用类的静态成员函数 静态成员是所有类对象共享所有对象都可以调用非静态成员内有this指针为类对象指针可以调用静态成员甚至非成员函数普通函数或其他类的成员函数都可以通过类名::静态成员的方法调用一个类的静态成员 了解了这些我们使用静态成员来做一道编程题 编程题 求123…n_ 描述 求123…n要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句 A?B:C。 数据范围 0n≤200 进阶 空间复杂度 O(1) 时间复杂度 O(n) 示例1 输入 5 返回值15 示例2 输入1 返回值1 思路 我们创建一个类设置两个静态成员变量一个sum存放所有数相加的和一个i表示当前需要加几编写其构造函数使创建一次对象sum加一次i同时使i自加1之后创建n个这个类的对象最后得到的sum就是总和因为成员变量一般放在private限定符下所以在通过创建一个静态成员函数来返回这个静态成员变量sum。 注意 创建n个对象可以使用变长数组 类名 arr[n] 或 new变长数组是c99中定义的是否可以使用取决于编译器是否支持在牛客网中的编译器支持这一语法。 代码 class Sum { public:Sum(){_sum _i;_i;}static int Print(){return _sum;} private:static int _sum;static int _i; };int Sum::_sum 0; int Sum::_i 1;class Solution { public:int Sum_Solution(int n) {Sum arr[n];return Sum::Print();} };3.匿名对象 我们创建对象还可以通过类名() 的方式创建这样的对象叫匿名对象声明周期 只有被创建的哪一行该行执行完对应的匿名对象就会被销毁。 class A { public:A(){cout A() endl;}A(int a, int b): _a(a), _b(b){cout A(int a, int b) endl;}~A(){cout ~A() endl;} private:int _a;int _b; };int main() {A(); //匿名对象A(1, 2); //匿名对象return 0; }使用场景 如果我们需要创建对象但对象创建后只使用一次那就可以用匿名对象 注意 匿名对象具有常性 需要使用引用接收匿名对象时需要使用const修饰。 4.友元 友元提供了一种突破封装的方法有时提供便利但友元会增加耦合度破坏了封装所以友元不宜多用。 友元分为友元函数 和 友元类 4.1友元函数 友元函数 是定义在类外部的普通函数 不属于任何类但需要在类的内部声明声明时需要加friend 关键字。友元函数 可以 直接访问 类的私有 成员。 特性 友元函数 内类对象可访问类的私有和保护成员但它不是类的成员函数友元函数不能用const修饰友元函数 可以在类定义的任何地方声明不受类访问限定符限制一个函数可以是多个类的友元函数友元函数的调用与普通函数的调用原理相同 class A { public:friend void test(A a); //友元函数的声明A(int a,int b):_a(a),_b(b){} private:int _a;int _b; };void test(A a) {cout a._a endl; }int main() {A a(1, 2);test(a);return 0; }4.2友元类 友元类所有成员函数都可以是另一个类的友元函数都可以访问另一个类中的非公有成员。 注意 友元关系是单向的不具有交换性。 友元关系不能传递 如果A是B的友元B是C的友元则不能说明A是B的友元 如果A是B的友元C也是B的友元也不能说明A和B一个是另一个的友元。 友元关系不能继承 class A { public:friend class B;//友元类的声明A(): _Aa(1), _Ab(2){}private:int _Aa;int _Ab; };class B { public:B(): _Ba(1), _Bb(2){A aa;cout aa._Aa aa._Ab endl;}private:int _Ba;int _Bb; };int main() {B bb;return 0; }5.内部类 如果一个类定义在另一个类的内部这个内部类就叫做内部类。内部类是一个独立的类它不属于外部类更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。 class A { public:A(): _Aa(1), _Ab(2){}class B{public:B(): _Ba(1), _Bb(2){A aa;cout aa._Aa aa._Ab endl;}private:int _Ba;int _Bb;};private:int _Aa;int _Ab;static int _Ac; };特性 内部类就是外部类的友元内部类可以通过外部类的对象参数来访问外部类中的所有成员但外部类不是内部类的友元。 内部类可以定义在外部类的public、protected、private都是可以的 想要创建一个内部类对象需要通过外部类指定 int main() {A::B bb;//创建内部类return 0; }注意内部类可以直接访问外部类中的static成员不需要外部里的对象/类名。 注意友元类不可以直接访问static成员 sizeof(外部类) 外部类和内部类没有任何关系。 int main() {cout sizeof(A) endl;return 0; }对于内部类我们只做了解就好在C中很少用到内部类而java中内部类用的倒是很多。 6.拷贝对象时的一些编译器优化 在传参和传返回值的过程中一般编译器会做出一些优化减少对象的拷贝这个在一些场景下可以帮我们提高程序的运行速率。 创建如下类通过下面这个类创建的对象进行操作观察现象搞清楚编译器的优化 class A { public:A(int aa 0):_a(aa){cout A() endl;}~A(){cout ~A endl;}A(const A aa):_a(aa._a){cout A(const A a) endl;}A operator(const A aa){if (aa ! this){_a aa._a;}cout A operator(const A a) endl;return *this;} private:int _a; };在上面讲explicit关键字时我们已经知道了类型替换的概念知道编译器会优化一些步骤使之更加便捷下面我们针对这一现象再来研究一下 6.1传值传参 void test1(A aa) {}void test3(const A aa) {}int main() {A aa1;//构造test1(aa1);//拷贝构造cout ----------------- endl;test3(aa1);//引用传参对象已存在无需进行构造或拷贝cout ----------------- endl;test1(A(1));//匿名对象构造拷贝构造 - 优化为直接构造cout ----------------- endl;test1(1);//隐式类型构造拷贝构造 - 优化为直接构造return 0; }对于正常的创建对象之后将对象传递给参数这样的操作虽然也进行了构造和拷贝两个步骤但它是在两行上分别执行的绝大多数编译器都不会在此处进行优化。(一些比较激进的编译器会这样做) 对于引用传参因为对象已经创建好了直接引用即可只执行了一个构造而且函数执行完后还可以接着使用但注意若传过去的对象不会改变建议使用const修饰防止发生变化。 对于使用匿名对象传参 或隐式类型替换 为对象的操作正常来看都需要经过构造、拷贝两个步骤形参才会被赋予数据而经过编译器优化后省去了拷贝的步骤直接使用初始化的值构造形参。但对象在函数执行完后就无法在使用。 6.2传值返回 A test2() {A a;return a; }A test4() {return A(1); }int main() {test2();//构造拷贝构造cout ----------------- endl;A aa2 test2();//构造拷贝构造拷贝构造 - 优化为构造 拷贝构造cout ----------------- endl;A aa1;//构造aa1 test2();//构造拷贝构造赋值重载cout ----------------- endl;A aa3 test4();//使用匿名对象返回构造拷贝拷贝 - 构造cout ----------------- endl;return 0; }对于传值返回中的第16行代码返回值由一个未定义的对象接收意味着以返回对象为参数调用拷贝构造函数定义该对象所以该行代码的执行步骤应该为构造、拷贝、拷贝编译器对其进行优化将原本test2中返回时需要拷贝出一个临时对象的操作优化为直接拷贝出所接收的对象将两个拷贝优化为一个拷贝。 对于第19行因为对象以及定义使用定义好的对象接收返回对象这里就是赋值重载对于赋值重载无法进行优化。 对于21行接收匿名函数返回的对象原本应该是匿名对象调用构造函数创建对象之后拷贝一个临时对象由临时对象在经过拷贝创建出所要的对象经过编译器优化两次拷贝都不在调用因为匿名对象只执行一行对象返回后就会被销毁编译器直接使用匿名对象构造出的对象作为接收返回值的对象所得结果相同但过程更为简洁。 总结 对象传参 尽量使用引用接收参数 对象返回 接收返回值对象尽量使用拷贝方法接收不要使用赋值接收函数中返回对象时尽量返回匿名对象。 7.理解类和对象 对于现实生活中的实体计算机是不认识的计算机只认识二进制格式的数据。如果想要让计算机认识现实生活中的实体用户必须通过某种面向对象的语言对实体进行描述然后通过编写程序创建对象后计算机才可以认识。 比如说我们使用的手机实体想要认识让计算机认识手机需要经过以下步骤 先对现实生活中手机实体进行抽象—即在人为思想层面对手机进行认识手机有什么属性有那些功能即对手机进行抽象认知的一个过程。经过1后在人的头脑中已经对手机有了一个清醒的认识只不过此时计算机还不清楚想要让计算机识别人想象中的手机就需要人通过某种面向对象的语言(如Java、C、Python等)将手机用类来进行描述并输入到计算机中。经过2后在计算机中就有了一个手机类但手机类只是站在计算机的角度对手机对象进行描述的通过手机类可以实例化出一个个具体的手机对象此时计算机才能知道手机是什么东西。此时用户就可以借助计算机中手机对象来模拟现实中的手机实体了。 在类和对象阶段大家一定要体会到 类是对某一类实体(对象)来进行描述的描述该对象具有那些属性那些方法描述完成后就形成了一种新的自定义类型用该自定义类型就可以实例化具体的对象。
http://www.eeditor.cn/news/123377/

相关文章:

  • 一个网站占空间有多少g北京注册工作室代理公司
  • 如何把学校网站建设好安卓版下载
  • 网站建设用的是什么软件商丘网站建设哪家好
  • 视频网站的链接怎么做的凡科是大厂吗
  • 知名高校网站建设网站建设开公司现在好做吗
  • 网上花店 网站源代码做网站的大公司
  • 浏览有关小城镇建设的网站 记录云南网站建设定做
  • 黑五手表网站互联网营销培训班
  • 找企业名录的网站凡科注册的网站怎么被百度收录
  • 网站上加一个浮动小框怎么做写作网站名字
  • ios7 风格 网站大连市建设工程招标信息网
  • 咸阳网站开发公司地址汽车网站建设模板
  • 佛山市网站建设分站企业北京企业建站模板
  • 站长统计app软件下载官网做网站的接口是意思
  • 做h5哪些网站好 知乎卫浴网站模板
  • 乐清建设公司网站网站推广优化外包公司
  • wap电影网站建设天河建设网站专家
  • 做网站花都区手机app下载软件安装
  • 网站个性化制作网站建设选哪家公司好
  • 网站集约化建设国内网络营销公司排名
  • 江西省赣州市地图广告优化师工资一般多少
  • 国内摄影作品网站如何自助建网站
  • php网站开发用什么php海口建站网站模板
  • 中国住建部网站查询网柒比贰主题wordpress
  • 用手机域名做网站有多少做电影网站多少带宽
  • 做个外贸网站设计网站开发历史
  • 博罗企业网站建设搬瓦工vps wordpress
  • 行业网站开发专业网站建设包括哪些
  • 手机网站分辨率做多大wordpress主题 免
  • 长沙手机网站建设公司排名在线网站建设培训班