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

wordpress同步发布优化好的网站

wordpress同步发布,优化好的网站,网站开发 安全,项目管理的软件有哪些目录 一、再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字 二、static成员2.1 概念2.2 特性 三、友元3.1 引入3.2 友元函数3.2.1 概念3.2.2 特性 3.3 友元类3.3.1 概念3.3.2 特性 四、内部类4.1 概念4.2 特性 五、匿名对象六、编译器的优化6.1 传参优化6.1.1 … 目录 一、再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字 二、static成员2.1 概念2.2 特性 三、友元3.1 引入3.2 友元函数3.2.1 概念3.2.2 特性 3.3 友元类3.3.1 概念3.3.2 特性 四、内部类4.1 概念4.2 特性 五、匿名对象六、编译器的优化6.1 传参优化6.1.1 传值传参6.1.2 传引用传参 6.2 返回优化6.2.1 创建对象再返回6.2.2 返回匿名对象 6.3 优化总结6.3.1 函数传参6.3.2 对象返回 七、再次理解封装总结 欢迎各位小伙伴关注我的专栏和我一起系统学习C共同探讨和进步哦 学习专栏 《进击的C》 一、再谈构造函数 1.1 构造函数体赋值 在创建对象时编译器通过调用构造函数给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _month;int _day; };虽然上述构造函数调用之后对象中已经有了一个初始值但是不能将其称为对对象中成员变量的初始化构造函数体中的语句只能将其称为赋初值而不能称作初始化。因为初始化只能初始化一次而构造函数体内可以多次赋值。 1.2 初始化列表 那么成员变量到底是在什么地方初始化的呢其实在构造函数的初始化列表里。 初始化列表以一个冒号开始接着是一个以逗号分隔的数据成员列表每个成员变量后面跟一个放在括号中的初始值或表达式。 class Date { public:Date(int year, int month, int day): _year(year), _month(month), _day(day){} private:int _year;int _month;int _day; };特性 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)类中包含以下成员必须放在初始化列表位置进行初始化 引用成员变量const成员变量自定义类型成员(且该类没有默认构造函数时) class Time { public:Time(int hour): _hour(hour){} private:int _hour; };class Date { public:Date(int year, int month, int day): _year(year), _month(month), _day(day), _t(10){} private:int _year;const int _month;//constint _day;//引用Time _t;//没有默认构造函数 };无论是否显式使用初始化列表成员变量都在初始化列表定义。所以尽量使用初始化列表初始化。成员变量在类中声明次序就是其在初始化列表中的初始化顺序与其在初始化列表中的先后次序无关。 请思考下面代码的运行结果 class A { public:A(int a): _a1(a), _a2(_a1){}void Print(){cout_a1 _a2endl;} private:int _a2;int _a1; }; int main() {A aa(1);aa.Print(); } A. 输出1 1 B.程序崩溃 C.编译不通过 D.输出1 随机值1.3 explicit关键字 先看看以下两种初始化的方式 class Time { public:Time(int hour): _hour(hour){} private:int _hour; };int main() {Time t1(4);Time t2 4;return 0; }第一种方式毫无疑问是构造函数而第二种方式是构造函数拷贝构造。先构造出t2对象再将4int隐式类型转换成Time最后拷贝给t2。但是在较新的编译器下会将该过程直接优化成带参构造。 C98中只允许对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数隐式类型转换。 C11中增加了可对多参构造函数隐式类型转换代码如下 class Time { public:Time(int hour, int minute): _hour(hour), _minute(minute){} private:int _hour;int _minute; };int main() {Time t1(4, 5);Time t2 { 4,5 };return 0; }而用explicit修饰构造函数将会禁止构造函数的隐式转换。 class Time { public:explicit Time(int hour): _hour(hour){}explicit Time(int hour, int minute): _hour(hour), _minute(minute){} private:int _hour;int _minute; };int main() {Time t1(4);Time t2 4;//errTime t3(4, 5);Time t4 { 4,5 };//errreturn 0; }二、static成员 2.1 概念 用static修饰的成员变量称之为静态成员变量用static修饰的成员函数称之为静态成员函数 2.2 特性 静态成员属于整个类存放在静态区而不属于某一个具体的对象静态成员变量必须在类外定义定义时不添加static关键字类中只是声明静态成员函数没有隐藏的this指针不能访问任何非静态成员 面试题实现一个类计算程序中创建出了多少个类对象。 方法一定义全局变量 因为std标准库中有一个count的函数所以防止命名冲突局部展开。 using std::cout; using std::endl;int count 0;//全局变量class A { public:A(int a 4): _a(a){count;}A(const A a): _a(a._a){count;} private:int _a; };int main() {A a1;A a2 5;A a3(3);cout count endl;return 0; }但是这种方法也有很大缺陷如果我不小心在外部直接对count进行修改那结果就不对了。 int main() {A a1;A a2 5;A a3(3);count;count;cout count endl;return 0; }方法二定义成员变量 但是如果定义为成员变量就属于某个具体的类了。所以我们加上static关键字让其属于整个类。 因为静态成员变量属于整个类所以不在初始化列表中定义而是在类外定义。 class A { public:A(int a 4): _a(a){count;}A(const A a): _a(a._a){count;}static int GetCount()//静态成员函数{return count;} private:int _a;static int count;//静态成员声明 };int A::count 0;//静态成员定义int main() {A a1;A a2 5;A a3(3);cout A::GetCount() endl;return 0; }因为count变成private类型的成员变量所以外界无法直接访问就要通过成员函数来获取count。但是调用非静态成员函数需要一个对象所以为了简便我们可以调用静态成员函数这样就可以通过类域直接访问。 【问题】 静态成员函数可以调用非静态成员函数吗非静态成员函数可以调用类的静态成员函数吗 三、友元 友元提供了一种突破封装的方式有时提供了便利。但是友元会增加耦合度破坏了封装所以友元不宜多用。 友元分为友元函数和友元类 3.1 引入 当我们要重载流插入操作符时如果定义为成员函数时不符合常规写法逻辑 class Date { public:Date(int year 2000, int month 1, int day 1): _year(year), _month(month), _day(day){}ostream operator(ostream out){out _year / _month / _day endl;return out;}istream operator(istream in){in _year _month _day;return in;} private:int _year;int _month;int _day; };int main() {Date d;d cin;//不符合常规写法逻辑d cout;return 0; }这是因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作数了。但是实际使用中cout需要是第一个形参对象才能正常使用。 所以我们只能将其重载为全局函数。但是全局函数又没办法访问private成员所以就用友元来解决。 3.2 友元函数 3.2.1 概念 友元函数可以直接访问类的私有成员它是定义在类外部的普通函数不属于任何类但需要在类的内部声明声明时需要加friend关键字。 class Date {friend ostream operator(ostream out, const Date d);friend istream operator(istream in, Date d); public:Date(int year 2000, int month 1, int day 1): _year(year), _month(month), _day(day){} private:int _year;int _month;int _day; };ostream operator(ostream out, const Date d) {out d._year / d._month / d._day endl;return out; } istream operator(istream in, Date d) {in d._year d._month d._day;return in; }int main() {Date d;cin d;cout d;return 0; }3.2.2 特性 友元函数可访问类的私有和保护成员但不是类的成员函数友元函数不能用const修饰友元函数可以在类定义的任何地方声明不受类访问限定符限制一个函数可以是多个类的友元函数 3.3 友元类 3.3.1 概念 在一个类中用friend修饰的类是友元类。友元类的所有成员函数都可以是另一个类的友元函数都可以访问另一个类中的非公有成员。 3.3.2 特性 友元关系是单向的不具有交换性。 如果A是B的友元不能说明B是A的友元。友元关系不能传递 如果C是B的友元 B是A的友元则不能说明C时A的友元。友元关系不能继承在继承位置再给大家详细介绍。 class Time {friend class Date;//友元类 public:Time(int hour 0, int minute 0, int second 0): _hour(hour), _minute(minute), _second(second){}void Print(){} private:int _hour;int _minute;int _second; };class Date { public:Date(int year 1900, int month 1, int day 1): _year(year), _month(month), _day(day){}void SetTimeOfDate(int hour, int minute, int second){// 直接访问时间类私有的成员变量_t._hour hour;_t._minute minute;_t._second second;}private:int _year;int _month;int _day;Time _t; }; 简单理解友元类可以访问定义友元的类而定义友元的类不能访问友元类。 四、内部类 4.1 概念 概念如果一个类定义在另一个类的内部这个内部的类就叫做内部类。内部类是一个独立的类它不属于外部类更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。 注意内部类就是外部类的友元类 4.2 特性 内部类可以定义在外部类的public、protected、private都是可以的。注意内部类可以直接访问外部类中的static成员不需要外部类的对象/类名。sizeof(外部类)外部类和内部类没有任何关系。 class A { private:static int k;int h; public:class B // B天生就是A的友元{public:void foo(const A a){cout k endl;//OKcout a.h endl;//OK}}; }; int A::k 1; int main() {A::B b;b.foo(A());//传参A的匿名对象return 0; }注意其他类不能访问内部类只有对应的外部类才能访问内部类。 五、匿名对象 对象可以匿名就像结构体匿名一样。 写法类名 通常情况下我们只想使用一次对象就会使用匿名对象。 class Solution { public:int Sum_Solution(int n){//...return n;} }; int main() {// 匿名对象在这样场景下就很好用当然还有一些其他使用场景这个我们以后遇到了再说cout Solution().Sum_Solution(10) endl;return 0; }六、编译器的优化 先写一个测试的类A class A { public:A(int a 1): _a(a){cout A(int) endl;}A(const A a):_a(a._a){cout A(const A) endl;}A operator(const A a){cout A operator(const A) endl;if (this ! a){_a a._a;}return *this;}~A(){cout ~A() endl;} private:int _a; };6.1 传参优化 6.1.1 传值传参 优化一般只在同一表达式进行不能跨表达式优化。 void f1(A a) {}int main() {A a1 1;//构造拷贝构造——》优化为构造f1(a1);//无优化只能在同一表达式进行优化f1(2);//构造拷贝构造——》优化为构造f1(A(3));//构造拷贝构造——》优化为构造return 0; }6.1.2 传引用传参 由于传引用本身就是最简所以不需要优化。 void f2(const A a) {}int main() {A a1 1;//构造拷贝构造——》优化为构造f2(a1);//无优化f2(2);//无优化f2(A(3));//无优化return 0; }6.2 返回优化 6.2.1 创建对象再返回 A f3() {A a;return a; }int main() {f3();//无优化因为在不同表达式A a1 f3();//构造两次拷贝构造——》优化为构造拷贝构造A a3;a3 f3();//思考这种写法与上述写法的区别return 0; }6.2.2 返回匿名对象 A f4() {return A(); }int main() {f4();//构造拷贝构造——》优化为构造A a2 f4();//构造两次拷贝构造——》优化为构造return 0; }6.3 优化总结 6.3.1 函数传参 尽量使用const 传参 6.3.2 对象返回 接收返回对象尽量以拷贝构造方式接收不要赋值接收函数中返回对象时尽量返回匿名对象 七、再次理解封装 现实生活中的实体计算机并不认识计算机只认识二进制格式的数据。如果想要让计算机认识现实生活中的实体用户必须通过某种面向对象的语言对实体进行描述然后通过编写程序创建对象后计算机才可以认识。 在类和对象阶段大家一定要体会到类是对某一类实体(对象)来进行描述的描述该对象具有那些属性那些方法描述完成后就形成了一种新的自定义类型才用该自定义类型就可以实例化具体的对象。 总结 至此类和对象章节结束。而从此刻开始才算是真正进入C的大门之所以有人说C难学大概就是前期门槛较高语法繁杂。但是此刻迈过这道坎便是轻舟已过万重山。
http://www.huolong8.cn/news/105626/

相关文章:

  • 长沙做个网站多少钱昆明网站建设 昆明光硕
  • 传统企业网站建设三亚最新政策
  • php快速建站系统泰州网站建设开发
  • 网页.网站.主页.网址.域名有什么联系河南省建设厅网站103
  • 局域网视频网站建设使用wordpress rss
  • 网站推广效果不好原因是百度指数怎么做
  • 网站类型定义跨境电商网站排行榜
  • 玉泉营网站建设公司做网站有没有用
  • 佛山网站设计怎么做庞各庄网站开发公司
  • 厦门微网站建设公司黑牛网站建设
  • 聊城网站空间公司上海闵行龙湖天街
  • 网站的分辨率是多少像素网站开发的思维导图
  • 太原建筑市场网站西安网站建设eliwe
  • 自己的网站做appwordpress 阅读权限
  • 菏泽公司做网站做的好看的旅游网站
  • 建设网站是普通办公吗宜春做网站
  • 跨境电商网站建设成本电商网站储值消费系统
  • 网站二级域名怎么做兰州市住房和建设局网站
  • 设计素材网站月收益福州网建公司
  • 企业建网站有这个必要吗铜山区规划建设局网站
  • 广东的网站建设案例tp5手机网站开发
  • 专门做油站数据的网站好用的ppt模板免费下载网站
  • 建站行业转型七牛图床 wordpress
  • 自己做网站卖仿货免费电视剧大全网站
  • a5建站扎区门户网站建设
  • 网推公司怎么收费宁波seo网络推广定制
  • 做移动端网站维护网站费用
  • 品牌建设网站公司排名石家庄最好的网站建设公司哪家好
  • 公司网站建设基本流程塘沽有哪些互联网公司
  • 代做机械毕业设计网站宁波市高新区建设局网站