C++之构造函数

C++在C基础上,抽象出了类和对象的概念,本文总结一点关于类和对象构造函数方面的细节。

1, 构造函数的函数名与类名一致

记住这一点,以后在看C++代码的时候,看到什么create,init之类的函数,都是不是构造函数,都是程序员自己拍脑袋定义的函数。

2, 默认的构造函数

构造函数有一个默认版本,即在程序员不显式定义任何构造函数的前提下,C++编译器会生成一个默认的构造函数,用于对象的初始化。

默认的构造函数没有参数!

3, 构造函数可以重载

函数重载是C++引入的特性,对于构造函数而言,依然也可以重载。(另一个C++引入区别于C的特性是,函数参数的默认值)

在有显式定义构造函数的情况下,就不再有默认的构造函数存在,所有的构造函数版本都是显式存在的。

4, 构造函数的调用

没有参数的构造函数,在创建对象的时候,不能使用圆括号,比如有一个AA对象:

AA a1();  // wrong

这样写,C++编译器会认为这是一个函数的申明。因此,对于没有参数的构造函数,可以这样:

AA a1;  // yes
AA a2{}; // yes

对于有参数的构造函数,可以写成类似函数调用的方式,因为参数的存在,C++可以分清这不是申明,同时,也可以使用{},比如有个类Student:

Student stu1{"xiaoa"};  // {} ok
stu1.show();
Student stu2("xiaob");  // () ok
stu2.show();

5, new的使用

C语言申请内存,使用malloc(配合free);C++在堆中创建对象的时候,就要使用new(配合delete)。

Student *pstu = new Student("xiaoc");
Student *pstu = new Student{"xiaoc"};

如果构造函数没有参数:

Student *stu1 = new Student;
Student *stu2 = new Student();  // right
Student *stu3 = new Student{};

在new的加持下,使用圆括号编译器也能够识别这是创建对象,而不是函数申明。

6, 构造函数必须是 public 属性的,否则创建对象时无法调用。

当然,设置为 private、protected 属性也不会报错,但是没有意义。

7, 构造函数的申明和定义,都没有返回值,不用写出void关键词。

你可能感兴趣的