带有参数的构造函数 (可以使每个对象有不同的初始化状态)
构造函数可以根据需要定义参数
一个类中可以存在多个重载的构造函数
构造函数的重载遵循 C++ 重载的规则
- class Test
- {
- public:
- Test(int v)
- {
- //use v to initialize member
- }
- }
友情提示
对象定义和对象声明不同
对象定义 -- 申请对象的空间并调用构造函数
对象声明 -- 告诉编译器存在这样一个对象
- Test t;// 定义对象并调用构造函数
- int main()
- {
- // 告诉编译器存在名为 t 的 Test 对象
- extern Test t;
- return 0;
- }
构造函数的自动调用
- class Test
- {
- public:
- Test() {
- }
- Test(int v) {
- }
- };
- int main
- {
- Test t; // 调用 Test()
- Test t1(1); // 调用 Test(int v)
- Test t2 = 1; // 调用 Test(int v)
- return 0;
- }
Test t1(1) 解析:
定义一个 Test 对象, 名字为 t1. 圆括号里面有个立即数 1, 看上去很像函数调用. 其实它用来告诉编译器
要调用带有参数的构造函数, 调用哪个带有参数的构造函数呢? 这时候就需要利用重载的规则了.
立即数 1 的类型为 int, 所以就告诉编译器所要调用的构造函数, 它只有一个参数, 并且参数的类型为 int. 在这个地方就是 Test(int v)
- #include <stdio.h>
- class Test
- {
- public:
- Test()
- {
- printf("Test()\n");
- }
- Test(int v)
- {
- printf("Test(int v), v = %d\n", v);
- }
- };
- int main()
- {
- Test t; // 调用 Test()
- Test t1(1); // 调用 Test(int v)
- Test t2 = 2; // 调用 Test(int v)
- int i(100); // 用 100 来初始化 i. 相当于 int i =100;
- printf("i = %d\n", i);
- return 0;
- }
注意:
- Test t2 = 2; // 用 2 来初始化 t2
- int i = 1; // 用 1 对变量就进行初始化
- i = 2; // 用 2 对变量 i 进行赋值
以前在学习 C 语言时, 初始化和赋值好像没有什么差别, 于是就将赋值和初始化混淆了.
在 C 语言中, 两者貌似差距很小. 但是在 C++ 中, 两者之间的差异很大. 原因是初始化会调用构造函数.
一定要记住, 初始化会调用构造函数, 赋值时调用的就不是构造函数了. 赋值的时候究竟发生了什么? 以后再说.
来源: http://www.bubuko.com/infodetail-3264397.html