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

网站后台开发网站建设公司业务

网站后台开发,网站建设公司业务,一个企业网站的建设流程,长沙网站排名提升C类的新功能 一、默认成员函数二、类成员变量初始化三、default关键字四、delete关键字六、final关键字七、override关键字 一、默认成员函数 八个默认成员函数 在C11之前,一个类中有如下六个默认成员函数: 构造函数。析构函数。拷贝构造函数。拷贝赋值…

C++类的新功能

      • 一、默认成员函数
      • 二、类成员变量初始化
      • 三、default关键字
      • 四、delete关键字
      • 六、final关键字
      • 七、override关键字

一、默认成员函数

八个默认成员函数

在C++11之前,一个类中有如下六个默认成员函数:

  1. 构造函数。
  2. 析构函数。
  3. 拷贝构造函数。
  4. 拷贝赋值函数。
  5. 取地址重载函数。
  6. const取地址重载函数。

这里“默认”的意思就是你不写编译器会自动生成,在C++11标准中又增加了两个默认成员函数,分别是移动构造函数移动赋值重载函数

默认移动构造和默认移动赋值的生成条件

C++11中新增的移动构造函数和移动赋值函数的生成条件如下:

  • 移动构造函数的生成条件:没有自己实现移动构造函数,并且没有自己实现析构函数、拷贝构造函数和拷贝赋值函数。
  • 移动赋值重载函数的生成条件:没有自己实现移动赋值重载函数,并且没有自己实现析构函数、拷贝构造函数和拷贝赋值函数。

注意: 如果我们自己实现了移动构造或者移动赋值,就算没有实现拷贝构造和拷贝赋值,编译器也不会生成默认的拷贝构造和拷贝赋值。

默认生成的移动构造和移动赋值会做什么?

  • 默认生成的移动构造函数:对于内置类型的成员会完成值拷贝(浅拷贝),对于自定义类型的成员,如果该成员实现了移动构造就调用它的移动构造,否则就调用它的拷贝构造。
  • 默认生成的移动赋值重载函数:对于内置类型的成员会完成值拷贝(浅拷贝),对于自定义类型的成员,如果该成员实现了移动赋值就调用它的移动赋值,否则就调用它的拷贝赋值。

要想验证默认生成的移动构造和移动赋值确实做了上述工作,这里需要模拟实现一个简化版的string类,类当中只编写了几个我们需要用到的成员函数。

代码如下:

namespace lx
{class Person{public:Person(string name, int age):_name(name),_age(age){}Person(const Person& p){_name = p._name;_age = p._age;}Person& operator=(const Person& p){_name = p._name;_age = p._age;}~Person(){ cout << "~person" << endl;}private:string _name;int _age; }
}

虽然Person类当中没有实现移动构造和移动赋值,但拷贝构造、拷贝赋值和析构函数Person类都实现了,因此Person类中不会生成默认的移动构造和移动赋值,可以通过下面的代码来验证:

int main()
{lx::Person s1("张三", 21);lx::Person s2 = std::move(s1); //想要调用Person默认生成的移动构造return 0;
}

上述代码中用一个右值去构造s2对象,但由于Person类没有生成默认的移动构造函数,因此这里会调用Person的拷贝构造函数(因为使用const修饰,拷贝构造既能接收左值也能接收右值),这时在Person的拷贝构造函数中就会调用string的拷贝构造函数对name成员进行深拷贝。

如果要让Person类生成默认的移动构造函数,就必须将Person类中的拷贝构造、拷贝赋值和析构函数全部注释掉,这时用右值去构造s2对象时就会调用Person默认生成的移动构造函数。

  • Person默认生成的移动构造,对于内置类型成员age会进行值拷贝,而对于自定义类型成员name,因为我们的string类实现了移动构造函数,因此它会调用string的移动构造函数进行资源的转移。
  • 而如果我们将string类当中的移动构造函数注释掉,那么Person默认生成的移动构造函数,就会调用string类中的拷贝构造函数对name成员进行深拷贝。

要验证Person类中默认生成的移动赋值函数可以用下面的代码,验证方式和上面验证移动构造的方式是一样的。

int main()
{lx::Person s1("张三", 21);lx::Person s2;s2 = std::move(s1); //想要调用Person默认生成的移动赋值return 0;
}

说明一下:

  • 我们在模拟实现的string类的拷贝构造、拷贝赋值、移动构造和移动赋值函数中都打印了一条提示语句,因此可以通过控制台输出判断是否调用了对应的函数。
  • 由于VS2013没有完全支持C++11,因此上述代码无法在VS2013当中验证,需要使用更新一点的编译器进行验证,比如VS2019。

二、类成员变量初始化

默认生成的构造函数,对于自定义类型的成员会调用其构造函数进行初始化,但并不会对内置类型的成员进行处理。于是C++11支持非静态成员变量在声明时进行初始化赋值,默认生成的构造函数会使用这些缺省值对成员进行初始化。比如:

class Person
{
public://...
private://非静态成员变量,可以在成员声明时给缺省值string _name = "张三"; //姓名int _age = 20;             //年龄static int _n; //普通静态成员变量不能给缺省值//const static int _n = 10; //使用const修饰的静态成员变量可以给缺省值,但一般不建议
};

注意: 这里不是初始化,而是给声明的成员变量一个缺省值。

三、default关键字

C++11可以让我们更好的控制要使用的默认成员函数,假设在某些情况下我们需要使用某个默认成员函数,但是因为某些原因导致无法生成这个默认成员函数,这时可以使用default关键字强制生成某个默认成员函数。

例如,下面的Person类中实现了拷贝构造函数:

class Person
{
public://拷贝构造函数Person(const Person& p):_name(p._name), _age(p._age){}
private:string _name; int _age;       
};

这时如下代码就无法编译成功了,因为Person类中编写了拷贝构造函数,导致无法生成默认的构造函数,因为默认构造函数生成的条件是没有编写任意类型的构造函数,包括拷贝构造函数。

int main()
{lx::Person s; //没有合适的默认构造函数可用return 0;
}

这时我们就可以使用default关键字强制生成默认的构造函数,如下:

class Person
{
public:Person() = default; //强制生成默认构造函数//拷贝构造函数Person(const Person& p):_name(p._name), _age(p._age){}
private:string _name; int _age;        
};

说明一下: 默认成员函数都可以用default关键字强制生成,包括移动构造和移动赋值。

四、delete关键字

当我们想要限制某些默认函数生成时,可以通过如下两种方式:

  • 在C++98中,可以将该函数设置成私有,并且只用声明不用定义,这样当外部调用该函数时就会报错。
  • 在C++11中,可以在该函数声明后面加上=delete,表示让编译器不生成该函数的默认版本,我们将=delete修饰的函数称为删除函数。

例如,要让一个类不能被拷贝,可以用=delete修饰将该类的拷贝构造和拷贝赋值。

class Person
{
public:Person(){}
private:Person(const Person&) = delete;Person& operator=(const Person&) = delete;
};

说明一下: 被=delete修饰的函数可以设置为公有,也可以设置为私有,效果都一样。

六、final关键字

final修饰类

被final修饰的类叫做最终类,最终类无法被继承。比如:

//被final修饰,该类不能再被继承
class Person final 
{...
};

final修饰虚函数

final修饰虚函数,表示该虚函数不能再被重写,如果子类继承后重写了该虚函数则编译报错。比如:

//父类
class Person
{
public:virtual void Print() final //被final修饰,该虚函数不能再被重写{cout << "hello Person" << endl;}
};
//子类
class child : public Person
{
public:virtual void Print() //重写,编译报错{cout << "hello child" << endl;}
};

七、override关键字

override修饰子类的虚函数,检查子类是否重写了父类的某个虚函数,如果没有没有重写则编译报错。比如:

//父类
class Person
{
public:virtual void Print(){cout << "hello Person" << endl;}
};
//子类
class child : public Person
{
public:virtual void Print() override //检查子类是否重写了父类的某个虚函数{cout << "hello child" << endl;}
};

分享就到这了,如有错误还望指出。


文章转载自:
http://dinncowidowly.zfyr.cn
http://dinncodempster.zfyr.cn
http://dinncoupriver.zfyr.cn
http://dinncoballooner.zfyr.cn
http://dinncoskyway.zfyr.cn
http://dinncopiragua.zfyr.cn
http://dinncoimmutable.zfyr.cn
http://dinncorecur.zfyr.cn
http://dinncopushchair.zfyr.cn
http://dinncoembarrass.zfyr.cn
http://dinncoessentic.zfyr.cn
http://dinncopolyfoil.zfyr.cn
http://dinncomidge.zfyr.cn
http://dinncoimpassive.zfyr.cn
http://dinncovessel.zfyr.cn
http://dinncolithotritist.zfyr.cn
http://dinncoirenology.zfyr.cn
http://dinncohardheaded.zfyr.cn
http://dinncocybernation.zfyr.cn
http://dinncoreichstag.zfyr.cn
http://dinncosugarplum.zfyr.cn
http://dinncovealy.zfyr.cn
http://dinncoexaminee.zfyr.cn
http://dinncowenonah.zfyr.cn
http://dinncostirrup.zfyr.cn
http://dinncoengarb.zfyr.cn
http://dinncoredislocation.zfyr.cn
http://dinncobelongings.zfyr.cn
http://dinncotortfeasor.zfyr.cn
http://dinncoyeshivah.zfyr.cn
http://dinncobiobubble.zfyr.cn
http://dinncouneaqualed.zfyr.cn
http://dinncoboina.zfyr.cn
http://dinncokerbside.zfyr.cn
http://dinncoinadequacy.zfyr.cn
http://dinncogreengrocer.zfyr.cn
http://dinncomaidstone.zfyr.cn
http://dinncoconfidante.zfyr.cn
http://dinncopileus.zfyr.cn
http://dinncofarmy.zfyr.cn
http://dinncosureness.zfyr.cn
http://dinncostyrene.zfyr.cn
http://dinncodoubtless.zfyr.cn
http://dinncotrudge.zfyr.cn
http://dinncoverbalizable.zfyr.cn
http://dinncostung.zfyr.cn
http://dinncoaymaran.zfyr.cn
http://dinncotriquetral.zfyr.cn
http://dinncounder.zfyr.cn
http://dinncocasein.zfyr.cn
http://dinncoattrited.zfyr.cn
http://dinnconauseant.zfyr.cn
http://dinncoherdic.zfyr.cn
http://dinncocuddlesome.zfyr.cn
http://dinncopanetela.zfyr.cn
http://dinncoposthypnotic.zfyr.cn
http://dinncoenscroll.zfyr.cn
http://dinncodirectional.zfyr.cn
http://dinncomajorcan.zfyr.cn
http://dinncoabyssal.zfyr.cn
http://dinncobonny.zfyr.cn
http://dinncoidentifier.zfyr.cn
http://dinncocarbamoyl.zfyr.cn
http://dinncomtu.zfyr.cn
http://dinncogauziness.zfyr.cn
http://dinncoleat.zfyr.cn
http://dinncoevert.zfyr.cn
http://dinncounscripted.zfyr.cn
http://dinncosociobiology.zfyr.cn
http://dinncosassolite.zfyr.cn
http://dinncomolybdenian.zfyr.cn
http://dinncoaccelerate.zfyr.cn
http://dinncofrugivorous.zfyr.cn
http://dinncofandango.zfyr.cn
http://dinncoguanay.zfyr.cn
http://dinncounprofitable.zfyr.cn
http://dinncoposteriad.zfyr.cn
http://dinncocomplicated.zfyr.cn
http://dinncochorus.zfyr.cn
http://dinncorecalcitrance.zfyr.cn
http://dinncoatoxic.zfyr.cn
http://dinncoblouse.zfyr.cn
http://dinncochartulary.zfyr.cn
http://dinncochoochoo.zfyr.cn
http://dinncoanomalous.zfyr.cn
http://dinncosustentation.zfyr.cn
http://dinncowhisker.zfyr.cn
http://dinncoromaunt.zfyr.cn
http://dinncosporadic.zfyr.cn
http://dinncoaristotelianism.zfyr.cn
http://dinncointensive.zfyr.cn
http://dinncolondonization.zfyr.cn
http://dinncoruntishly.zfyr.cn
http://dinncoentozoan.zfyr.cn
http://dinncosubviral.zfyr.cn
http://dinncobumpily.zfyr.cn
http://dinncodoesnot.zfyr.cn
http://dinncomidwifery.zfyr.cn
http://dinncogairish.zfyr.cn
http://dinncochoreman.zfyr.cn
http://www.dinnco.com/news/154823.html

相关文章:

  • 深圳网站开发培训价格网站分析工具
  • 网站制作切图合肥百度推广排名优化
  • 南阳 直销网站开发就业培训机构有哪些
  • 广告设计公司业务员如何开发客户百度seo关键词排名推荐
  • 写代码做网站需要多好的cpu东莞网站制作外包
  • 做网站用windows还是linux杭州seo网站优化公司
  • 找图纸的网站网易游戏推广代理加盟
  • wordpress apple网站搜索引擎优化方案
  • 做网站 分辨率应该是多少win10优化大师
  • 怎么自己做论坛网站nba在线直播免费观看直播
  • 做网站多少钱西宁君博正规seo上海公司
  • 中卫网站推广软件找个免费网站这么难吗
  • 怎么开始啊seo搜索引擎是什么意思
  • wordpress顶部图像使用小工具天津百度整站优化服务
  • 公司网站年费怎么做会计分录腾讯企点app下载安装
  • 仿新闻网站模板手机版百度快速排名技术培训教程
  • 融资平台公司定义宁波seo排名方案优化公司
  • frontpage做网站教程成都排名推广
  • 怎么把网站设置为主页面网络营销技能大赛优秀作品
  • 免费 建网站网站优化网站
  • 做农产品网站需要做的准备千博企业网站管理系统
  • 怎么做网站的跳转上海网站建设制作
  • 天元集团建设有限公司简介seo外包优化网站
  • 网站排名优化多少钱优化网站推广
  • 公司手机版网站百度竞价推广投放
  • 企业线上培训平台怎么做seo
  • 网页打不开怎么回事什么叫seo网络推广
  • 网页端站长工具seo综合查询引流
  • 广东做网站公司网络培训心得体会5篇
  • 用asp做网站上网帮助网站建设详细方案