第18课构造函数(中)

带有参数构造函数(可以使每个对象有不同的初始化状态)
  构造函数可以根据需要定义参数
  一个类中可以存在多个重载的构造函数
  构造函数的重载遵循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)

 1 #include <stdio.h>
 2 
 3 class Test
 4 {
 5 public:
 6     Test() 
 7     { 
 8         printf("Test()\n");
 9     }
10     Test(int v) 
11     { 
12         printf("Test(int v), v = %d\n", v);
13     }
14 };
15 
16 int main()
17 {
18     Test t;      // 调用 Test()
19     Test t1(1);  // 调用 Test(int v)
20     Test t2 = 2; // 调用 Test(int v)
21     
22     int i(100);  //用100来初始化i。相当于int i =100;
23     
24     printf("i = %d\n", i);
25     
26     return 0;
27 }

注意:
Test t2 = 2; //用2来初始化t2
int i = 1; //用1对变量就进行初始化

i = 2; //用2对变量i进行赋值
以前在学习C语言时,初始化和赋值好像没有什么差别,于是就将赋值和初始化混淆了。
在C语言中,两者貌似差距很小。但是在C++中,两者之间的差异很大。原因是初始化会调用构造函数。

一定要记住,初始化会调用构造函数,赋值时调用的就不是构造函数了。赋值的时候究竟发生了什么?以后再说。

猜你喜欢

转载自www.cnblogs.com/-glb/p/11762176.html