第18课 对象的构造(中)
1. 带参数的构造函数
(1)构造函数可以根据需要定义参数
(2)一个类中可以存在多个重载的构造函数
(3)构造函数的重载遵循C++重载规则
【友情提示】对象的定义和声明不同
①对象定义:申请对象的内存空间并调用构造函数(如Test t;//定义并调用构造函数)
②对象声明:告诉编译器己经存在一个对象,并不调用构造函数(如extern Test t;)
2. 构造函数的调用
(1)一般情况下,编译器会根据给定的参数情况自动调用相应的构造函数
【编程实验】带参数的构造函数 18-1.cpp
#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); printf("i = %d\n", i); return 0; }
运行结果:
(2)一些特殊情况下,需要手工调用构造函数
【编程实验】构造函数的手动调用 18-2.cpp
#include <stdio.h> class Test { private: int m_value; public: //不带参的构造函数 Test() { m_value = 0; printf("Test()\n"); } Test(int v) { m_value = v; printf("Test(int v), v = %d\n", v); } int getValue(){return m_value;} }; int main() { //Test ta[3] = {1, 2, 3};//编译器自动调用带参构造函数 //定义数组对象,并手动调用带参构造函数来初始化各个对象 Test ta[3] ={Test(), Test(1), Test(2)}; for(int i = 0;i< 3;i++) { printf("ta[%d].getValue() = %d\n", i, ta[i].getValue()); } Test t = Test(100); //定义并手动调用构造函数来初始化对象 return 0; }
运行结果:
3. 小实例:开发一个数组类解决原生数组的安全性问题(需求)
(1)提供函数获取数组的长度
(2)提供函数获取数组的元素
(3)提供函数设置数组元素
【编程实验】数组类的实现 IntArray
//IntArray.h
#ifndef _INTARRAY_H_ #define _INTARRAY_H_ class IntArray { private: int m_length; int* m_pointer; public: IntArray(int len); ~IntArray(); int length(); bool get(int index, int& value); bool set(int index, int value); }; #endif
//IntArray.cpp
#include "IntArray.h" IntArray::IntArray(int len) { m_pointer = new int[len]; for(int i = 0; i<len; i++) { m_pointer[i] = 0; } m_length = len; } IntArray::~IntArray() { if(m_pointer) { delete[] m_pointer; } } int IntArray::length() { return m_length; } bool IntArray::get(int index, int& value) { bool bRet = (0 <= index) && (index <m_length); if(bRet) { value = m_pointer[index]; } return bRet; } bool IntArray::set(int index, int value) { bool bRet = (0 <= index) && (index <m_length); if(bRet) { m_pointer[index] = value; } return bRet; }
//main.cpp
#include <stdio.h> #include "IntArray.h" int main() { IntArray a(5);//利用IntArray创建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); } } return 0; }
运行结果:
4. 小结
(1)构造函数可以根据需要定义参数
(2)构造函数之间可以存在重载关系
(3)构造函数遵循C++中重载函数的规则
(4)对象定义时(注意,不是声明)会触发构造函数的调用(自动调用构造函数)
(5)在一些情况下可以手动调用构造函数(手动调用构造函数)