首页 > 知识百科 > 正文

【C++】类与对象——初始化列表、静态静态成员、初始


类与对象

1 再谈构造函数1.1 构造函数体赋值1.2 初始化列表语法:建议:初始化顺序:注意: 1.3 显式关键字 2 static 静态成员2.1 概念2.2 声明成员变量2.3 使用类的静态成员2.4 定义静态成员!!!感谢♪(・ω・)ノ感谢阅读下一篇文章见!!!

1再谈构造函数

1.1构造函数体赋值

在创建对象时,编译器通过构造调用函数,给对象中各个成员变量一个合适的初始值,在我们之前实现的Date类对象如下。

class 日期{公开 :日期(int int  int){_year =;_month =;_日=;}私有:int _year;int _month;int _day;}< span class="bf83-2835-007e-2daf token punctuation">;

虽然上述构造函数调用的时候,对象中成员变量都有一个初始值了,但是不能将其成为对象中成员变量的初始化,构造函数中语句只能将其成为赋初值,不能初始化调用。因为初始化只能初始化一次,而构造函数可以多次赋值。接下来我们有了初始化列表的概念。

1.2初始化列表

语法:

初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个“成员”后面跟一个放在逗号中的初始值或表达式。

 日期{public:日期(int int int):_year(年< span class="2daf-133e-3601-689c token punctuation">),_month),_day(){ }私有:int _year; int _month;int _day;};

有时我们可以忽略数据成员初始化的建议和赋值之间的差异,但并不总是这样。
如果成员是 const 或变量引用的话,必须将其初始化。类似的如果存在自定义类型并且该类不构造存在函数时,也必须将其初始化。例如:

 A {私有:int a;}; 日期{公共< /span>:日期(int, int,< /span> int){< /span>_year =;_月 = 月< span 类=“代币pu”nctuation">;_day =;}私有:const int _year;int& _month;int _day;一个;};int< /span> main(){const 日期 a1(20242 ,24);返回 0;}

来看看报错:

显然我们需要初始化来帮助我们解决这些问题。
在很多类中初始化和赋值的事区别关乎简单效率的问题:首先直接初始化一些数据成员,晚上则先初始化再赋值。除了效率问题外更重要的是,数据成员必须初始化。所以一般建议养生成使用初始化列表的习惯,这样可以避免某些意外的编译错误,特别是遇到类初始化构造函数初始值的成员时。

初始化顺序:

显然在构造函数中每个是成员只能出现一次。否则给同一个成员赋予两个不同的初始值有什么意义呢?
需要注意初始化列表没有限定初始化的执行顺序,成员因为初始化的顺序与他们在类中出现的顺序一致,第一个成员先初始化,第二个,以此类推,构造函数初始化列表的前后位置并不影响下面实际的初始化顺序。
但是这个例子不同:

 A{公共< /span>:A(int a):_a1(a),_a2(_a1){}void 打印() { cout << _a1 << " " << _a2 << endl;}私有< /span>:int _a2;int _a1;};< /span>int main() {A aa(1);aa<跨度class="f34a-8535-696b-bf83 token punctuation">。打印() ;}

我们想要两个输出1 1 ,但是程序实际输出了:

这就是因为初始化顺序的问题了,因为成员_a2在_a1之前,所以先对_a2初始化,就造成了随机值。

注意:

每个成员变量在初始化列表中只能出现一次(只能初始化一次)类中包含以下成员,必须在初始化列表中进行初始化:
成员引用变量
const成员变量
自定义类型成员(并且该类没有构造默认函数时)尝试使用初始化列表初始化,因为无论你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化成员变量,在类中声明队列就是其在初始化列表中的初始化顺序,与在初始化列表中的前置队列相关。 h3>1.3关键字explicit

构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余默认值的构造函数,还具有类型转换的作用。

class 日期{公开// 1. 单参构造函数,没有使用显式转换,具有类型转换作用// 显式修饰构造函数,禁止类型转换---显式转换之后,代码可以通过编译 显式 日期( int) :_year() {}私有: < span class="ee10-d0ac-b0c2-9b07 token 关键字">int _year; int _monthint _day;};void 测试(){ 日期 d1(2023); //用一个整形戒指给数据类型对象赋值 //实际编译背后器会用2023构造一个无名对象, //最后用无名对象给d1对象进行属性} 
  日期{public:// 2.虽然有多个参数,但是创建对象时后参数可以不传递,//不使用显式修饰,具有类型转换作用//显式修饰构造函数,禁止类型转换显式 日期( int int= 1, int= 1) _year() , _月(), _day(){}日期& 运算符=( const 日期& d){if (这个 != &d)<跨度类=“到ken punctuation">{_year = d._year;_month = d_month;_day = d._day;}返回 *这个;}私有< span class="2daf-133e-3601-689c token 运算符">:int _year;int _month;int _day;};void 测试(){日期 d1(2023 );//用一个整形戒指给日期类型对象赋值//实际编译器背后会用2023构造一个无名对象,//最后用无名对象给d1对象进行属性< /span>d1 = 2023;//将1发光掉,2放开时则编译失败,因为explicit修饰构造函数,//禁止了单参构造函数类型转换的作用}

由于上述代码确实性不太好,所以一般单参数的类构造都要使用显式修饰。

2 个静态静态

有时候类需要一些成员与类本身直接相关,而不是与类的各个对象保持联系。
例如,一个银行账户类对象可能需要一个数据成员来表示当前基准利率。在例中,我们希望利率与类的各个对象关联,而不是与类的每一个个对象关联。从实现效率的角度来看,没必要每个对象都存储利率信息。而且更重要的是,一旦利率浮动,我们希望所有对象都可以使用新值。所以引入静态成员的概念。

2.1 概念

声明为静态的类成员称为类的静态成员,用静态方法的成员变量,称为静态成员变量;用静态方法的成员函数,命名静态成员函数。静态成员变量一定要在类外进行初始化

2.2 成员声明变量

我们通过在成员的声明加入之前关键字 static 就可以创建,和其他成员一样,静态成员也可以是 public 或 private 的。静态变量的类型可以是常量,引用,指针,类类型等。
而且,静态成员函数也不是与任何对象绑定在一起,它们不包含这个指针。作为结果,静态成员函数不能声明成 const 的而且我们也不能在静态函数内部使用这个指针。这个限制及适用于这个显式的使用,也对调用非静态成员的隐式使用有效。

2.3 使用类的静态成员

使用时我们通过作用域间接访问式静态成员。
成员不属于类的某个对象,但是我们仍然可以使用类的对象、引用、或者指针来访问静态成员。如下:

 日期{公开 :日期(int int  int):_year() _月()_day() { }静态 void 计数(); 私有:int _year;int _month;int  _day;};void 计数()< /span>{}int< /跨度>main(){日期 d1;日期* d2 = &d1; d2-> 计数();d1.计数(< /span>);返回 0;}

2.4 定义静态成员

和其他成员函数一样,我们既可以在类内部也可以在外部定义。当在类外部定义时,不需要重复写 static 关键字,该关键字只出现在类内部的声明语句。
和类的所有成员一样,当我们指向类外部的静态成员时,必须指明成员所属的类名。static 关键字则只出现在类内部的声明语句中
要确保对象只定义一次,最好的办法就是把静态成员的定义与其他非内联函数的定义放在同一个文件中。

总结

静态成员为所有类对象所共享

总结

静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区静态成员变量必须在类外部定义,时定义不添加静态关键字,类中只是声明类静态成员可以用类名::静态成员或者object.static成员来访问静态成员函数没有隐藏这个指针,不能访问任何非静态成员静态成员也是类的成员,受public、protected、private访问限定符的限制

谢谢♪(・ω・)ノ谢谢阅读

下一篇文章见!!!

【C++】类与对象——初始化列表、静态静态成员、初始由知识百科栏目发布,感谢您对的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【C++】类与对象——初始化列表、静态静态成员、初始

Copyright © 2012-2023 普诚元亨工作室 版权所有

*本站部分网页素材及相关资源来源互联网,如有侵权请速告知,我们将会在24小时内删除*

Z-BlogPHP 1.7.3 琼ICP备2022020219号