一.再探构造函数1.之前我们实现构造函数时初始化成员变量主要使⽤函数体内赋值构造函数初始化还有⼀种⽅ 式就是初始化列表初始化列表的使⽤⽅式是以⼀个冒号开始接着是⼀个以逗号分隔的数据成 员列表每个成员变量后⾯跟⼀个放在括号中的初始值或表达式。2.每个成员变量在初始化列表中只能出现⼀次语法理解上初始化列表可以认为是每个成员变量定义初始化的地⽅。3.引⽤成员变量const成员变量没有默认构造的类类型变量必须放在初始化列表位置进⾏初始 化否则会编译报错。补充一下声明是不开空间的定义才会开空间初始化列表是这三个特殊成员变量定义的地方4.C11⽀持在成员变量声明的位置给缺省值这个缺省值主要是给没有显示在初始化列表初始化的 成员使用的。5.尽量使用初始化列表初始化因为那些你不在初始化列表初始化的成员也会走初始化列表因为初始化列表是每个成员定义的地方如果这个成员在声明位置给了缺省值初始化列表会用这个缺省值初始化。如果你没有给缺省值对于没有显示在初始化列表初始化的内置类型成员是否初始化取决于编译器通常会初始化一个随机值C并没有规定。对于没有显示在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数如果没有默认构造会编译错误补充给缺省值和函数参数一样。一般只能给常量对象或者是全局对象最后来看一道题目正常情况下如果初始化列表显式初始化了就和缺省值没什么关系了B,E,F就排除了想解决这个题还需要补充一个点6.初始化列表中按照成员变量在类中声明顺序进行初始化对象的底层是按照声明的顺序排布的初始化的时候是按照对象的内存分布进行初始化跟成员在初始化列表出现的先后顺序无关。建议声明顺序和初始化列表顺序保持一致这里a初始化a1不会先执行因为声明的时候a2在前面所以会先会用a1初始化a2但a1是随机值对象被整体定义出来的时候空间已经被开出来了初始化列表只是界定定义的地方但是a1现在没有值是随机值所以a2也是随机值了所以该题选D二.类型转换到这再看C这里的类型转换这里A类型对象的初始化有两种写法一个是语法上调用构造另一个就是隐式类型转换这里能进行隐式类型转换的原因就是其构造函数用整型做参数构造了A对象其语法逻辑上1也是先构造一个临时对象临时对象再拷贝构造给a2这样设计的意义在下面两个场景体现C中类类型在做函数形参的时候就不建议用传值传参了传值传参会调用拷贝构造是一种性能浪费要尽可能使用引用但是普通的引用传不了const对象会造成权限放大所以在使用时会形参的引用要尽量加const但是除此之外还有一个原因这样形参是A类型的const引用不仅可以传A类型也可以传1另一个场景就是如果在数据结构中存一个自定义类型类类型现在往栈中插入A类型的两个数据也可以用隐式类型转换了这里还可以直接给缺省值更加方便三.static成员静态成员本质上可以理解为是类中定义的全局变量其生命周期是全局的用static修饰的成员变量称之为静态成员变量静态成员变量一定要在类外进行初始化静态成员变量为所有类对象所共享不属于某个具体的对象不存在对象中存放在静态区也就是说其声明周期是全局的A对象之中是没有count的用static修饰的成员函数称之为静态成员函数静态成员函数没有this指针静态成员函数中可以访问其他的静态成员但是不能访问非静态的因为没有this指针非静态的成员函数可以访问任意的静态成员变量和静态成员函数突破类域和使用访问限定符访问如图直接访问不能访问_count就可以提供成员函数进行访问突破类域和访问限定符就可以访问静态成员可以通过类名::静态成员或者对象.静态成员来访问静态成员变量和静态成员函数静态成员也是类的成员受public、pritected、private访问限定符和类域的限制
C++类和对象:从构造函数到static成员
发布时间:2026/5/21 3:57:21
一.再探构造函数1.之前我们实现构造函数时初始化成员变量主要使⽤函数体内赋值构造函数初始化还有⼀种⽅ 式就是初始化列表初始化列表的使⽤⽅式是以⼀个冒号开始接着是⼀个以逗号分隔的数据成 员列表每个成员变量后⾯跟⼀个放在括号中的初始值或表达式。2.每个成员变量在初始化列表中只能出现⼀次语法理解上初始化列表可以认为是每个成员变量定义初始化的地⽅。3.引⽤成员变量const成员变量没有默认构造的类类型变量必须放在初始化列表位置进⾏初始 化否则会编译报错。补充一下声明是不开空间的定义才会开空间初始化列表是这三个特殊成员变量定义的地方4.C11⽀持在成员变量声明的位置给缺省值这个缺省值主要是给没有显示在初始化列表初始化的 成员使用的。5.尽量使用初始化列表初始化因为那些你不在初始化列表初始化的成员也会走初始化列表因为初始化列表是每个成员定义的地方如果这个成员在声明位置给了缺省值初始化列表会用这个缺省值初始化。如果你没有给缺省值对于没有显示在初始化列表初始化的内置类型成员是否初始化取决于编译器通常会初始化一个随机值C并没有规定。对于没有显示在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数如果没有默认构造会编译错误补充给缺省值和函数参数一样。一般只能给常量对象或者是全局对象最后来看一道题目正常情况下如果初始化列表显式初始化了就和缺省值没什么关系了B,E,F就排除了想解决这个题还需要补充一个点6.初始化列表中按照成员变量在类中声明顺序进行初始化对象的底层是按照声明的顺序排布的初始化的时候是按照对象的内存分布进行初始化跟成员在初始化列表出现的先后顺序无关。建议声明顺序和初始化列表顺序保持一致这里a初始化a1不会先执行因为声明的时候a2在前面所以会先会用a1初始化a2但a1是随机值对象被整体定义出来的时候空间已经被开出来了初始化列表只是界定定义的地方但是a1现在没有值是随机值所以a2也是随机值了所以该题选D二.类型转换到这再看C这里的类型转换这里A类型对象的初始化有两种写法一个是语法上调用构造另一个就是隐式类型转换这里能进行隐式类型转换的原因就是其构造函数用整型做参数构造了A对象其语法逻辑上1也是先构造一个临时对象临时对象再拷贝构造给a2这样设计的意义在下面两个场景体现C中类类型在做函数形参的时候就不建议用传值传参了传值传参会调用拷贝构造是一种性能浪费要尽可能使用引用但是普通的引用传不了const对象会造成权限放大所以在使用时会形参的引用要尽量加const但是除此之外还有一个原因这样形参是A类型的const引用不仅可以传A类型也可以传1另一个场景就是如果在数据结构中存一个自定义类型类类型现在往栈中插入A类型的两个数据也可以用隐式类型转换了这里还可以直接给缺省值更加方便三.static成员静态成员本质上可以理解为是类中定义的全局变量其生命周期是全局的用static修饰的成员变量称之为静态成员变量静态成员变量一定要在类外进行初始化静态成员变量为所有类对象所共享不属于某个具体的对象不存在对象中存放在静态区也就是说其声明周期是全局的A对象之中是没有count的用static修饰的成员函数称之为静态成员函数静态成员函数没有this指针静态成员函数中可以访问其他的静态成员但是不能访问非静态的因为没有this指针非静态的成员函数可以访问任意的静态成员变量和静态成员函数突破类域和使用访问限定符访问如图直接访问不能访问_count就可以提供成员函数进行访问突破类域和访问限定符就可以访问静态成员可以通过类名::静态成员或者对象.静态成员来访问静态成员变量和静态成员函数静态成员也是类的成员受public、pritected、private访问限定符和类域的限制