第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)spa

 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对变量就进行初始化code

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

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

 

构造函数的调用
-通常状况下,构造函数在对象定义时被自动调用
-一些特殊状况下,须要手工调用构造函数
如何建立一个对象数组?
编程实验:构造函数的手动调用开发

 1 #include <stdio.h>
 2 
 3 class Test  4 {  5 private:  6     int m_value;  7 public:  8  Test()  9  { 10         printf("Test()\n"); 11         
12         m_value = 0; 13  } 14     Test(int v) 15  { 16         printf("Test(int v), v = %d\n", v); 17         
18         m_value = v; 19  } 20     int getValue() 21  { 22         return m_value; 23  } 24 }; 25 
26 int main() 27 { 28     Test ta[3] = {Test(), Test(1), Test(2)}; 29     
30     for(int i=0; i<3; i++) 31  { 32         printf("ta[%d].getValue() = %d\n", i , ta[i].getValue()); 33  } 34     
35     Test t = Test(100); 36     
37     printf("t.getValue() = %d\n", t.getValue()); 38     
39     return 0; 40 }

需求:开发一个数组类解决原生数组的安全性问题
-提供函数获取数组长度
-提供函数获取数组元素
-提供函数设置数组元素

IntArray.h

 1 #ifndef _INTARRAY_H_  2 #define _INTARRAY_H_
 3 
 4 class IntArray  5 {  6 private:  7     int m_length;  8     int* m_pointer;  9 public: 10     IntArray(int len); 11     int length(); 12     bool get(int index, int& value); 13     bool set(int index ,int value); 14     void free(); 15 }; 16 
17 #endif

IntArray.cpp

 1 #include "IntArray.h"
 2 
 3 IntArray::IntArray(int len)  4 {  5     m_pointer = new int[len];  6     
 7     for(int i=0; i<len; i++)  8  {  9         m_pointer[i] = 0; 10  } 11     
12     m_length = len; 13 } 14 
15 int IntArray::length() 16 { 17     return m_length; 18 } 19 
20 bool IntArray::get(int index, int& value) 21 { 22     bool ret = (0 <= index) && (index < length()); 23     
24     if( ret ) 25  { 26         value = m_pointer[index]; 27  } 28     
29     return ret; 30 } 31 
32 bool IntArray::set(int index, int value) 33 { 34     bool ret = (0 <= index) && (index < length()); 35     
36     if( ret ) 37  { 38         m_pointer[index] = value; 39  } 40     
41     return ret; 42 } 43 
44 void IntArray::free() 45 { 46  delete[]m_pointer; 47 }

main.cpp

#include <stdio.h> #include "IntArray.h"

int main() { IntArray a(5); for(int i=0; i<a.length(); i++) { a.set(i, i + 1); } for(int i=0; i<a.length(); i++) { int value = 0; if( a.get(i, value) ) { printf("a[%d] = %d\n", i, value); } } a.free(); return 0; }

小结:

构造函数能够根据须要定义参数
构造函数之间能够存在重载关系
构造函数遵循C++中重载函数的规则
对象定义时会触发构造函数的调用
在一些状况下能够手动调用构造函数

相关文章
相关标签/搜索