c++中类的相关概念
1. 类的定义
为什么类的定义后面一定要加“;”?
因为类后面是可以直接定义实例,但是并不建议这样定义,因为可读性比较差,变量最好单独定义。
1 | // bad idea |
2. 变量的初始化
变量后面直接跟着相应的数值成为初始化(initialize),是变量刚开始创建的时候,给的一个值。
1 | // 可以使用前面的定义 |
c++中初始化(initialization)与赋值(assignment)是两个不同的概念,初始化是变量创建的时候发生的,赋值是值将变量的值替换。
初始化的方式有四种:
1 | int units_sold = 0; |
花括号的方式称为列表初始化,列表初始化,不会对字面量做转化。
1 | int a{3.14}; // not allowed |
如果没有初始化,则会对变量进行默认初始化(default initializer)。
函数外部的变量会定义为0或空,函数内部的变量则不会进行初始化,未初始化的变量不能进行拷贝与访问内部成员。
- 类内的成员变量如果没有显式初始化,则进行默认初始化,字符串类型变量为空,整形初始化为0 (GCC编译器并非如此)
- 类内的成员变量初始化不允许‘()’形式
3. struct与class的区别
struct与class的位移区别是默认访问权限的区别,如果所有成员都默认为public则用struct字段,如果默认为私有则用class。
public定义接口(interface);
private封装(encapsulate)内部成员。
4. 构造函数
构造函数是指与类名相同,没有返回类型,具有参数列表,可以重载的函数。
当且仅当没有定义构造函数,则内部成员变量会进行默认初始化(default initializer)和类内初始化器(in-class initializer),默认初始化在默认构造函数内进行。在gcc上没有复现
1 | class A { |
如果自定义构造函数,则所有的内部成员变量都在构造函数内进行初始化。也可以不用
构造函数的几种写法:
1 | struct A { |
默认构造函数、析构函数对使用了动态内存的程序并不有效。
5. 类型转换
C++中有两种函数可以执行类型转换,一种为单变量的构造函数(或无默认值的参数),一种为类型转换运算符重载。
单变量的构造函数会为编译器提供一种隐式类型转换的方法,例如:
1 |
|
C++11引入explicit显式声明不允许进行隐式类型转换,例如
1 | class Sale_data { |
explicit还作用域列表初始化语法,例如:
1 | class Sale_data { |