参考自《Visual C++ 2013 入门经典》P287
// xigouhanshu.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <vector>
#include <string>
using namespace std;
using namespace std;
class Cbox
{
protected:
double m_height;
double m_width;
double m_length;
char* m_pMsg;
public:
//关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。
//声明为explicit的构造函数不能在隐式转换中使用。
explicit Cbox(double lv, double wv, double hv, char* text = "Default Value") :m_height(hv), m_width(wv), m_length(lv)
{
cout << "Constructor called" << endl;
size_t len = strlen(text) + 1;
m_pMsg = new char[len + 1]; //指针,还没分配空间
strcpy_s(m_pMsg, len + 1, text); //#include <cstring>
}
Cbox()
{
cout << "Construtor called~~~~ " << endl;
}
//默认?再定义i拷贝构造
//私有成员包含了一个指针,如果不定义拷贝函数,两个对象中指针成员会指向同一个对象(字符串),一改皆改
//定义拷贝构造重要性,类定义外的函数,如果参数是该类,而不是引用类型,采用值传递的方式,就会出错
Cbox(const Cbox& copy)
{
size_t len = strlen(copy.m_pMsg) + 1;
m_pMsg = new char[len + 1]; //这里 如果写成new char(len+1)析构会有异常出现
strcpy_s(m_pMsg, len, copy.m_pMsg);
cout << "copy constructor " << endl;
}
~Cbox()
{
cout << "Destructor called" << endl;
delete[] m_pMsg; //不释放内存,也可以正常结束;但在大型程序中,太多的动态分配对象会耗尽内存
}
//在函数中动态创建对象,函数返回时会自动销毁该对象
void showIt()const
{
cout << m_pMsg << endl;
}
double getVoume()const
{
return m_height*m_width*m_length;
}
};
bool compare(const Cbox* p)
{
if (!p)
return false;
Cbox a(10, 10, 10, "anyway");
return a.getVoume() > p->getVoume();
}
int main()
{
//如果不定义析构函数,会有默认析构
//自动生成的变量(非new生成的)在程序结束时调用
Cbox a(12, 12, 12);
Cbox b(10, 10, 10, "QQQ");
char* c = "LLL";
Cbox d(10, 10, 10, c);
Cbox e(d); //拷贝构造
//Cbox b[5];
Cbox* p = nullptr; //不会构造
p = &a;
//空闲寄存器中生成的变量,需要在类的析构函数中显式定义
compare(&a);
Cbox* q = new Cbox{ 5,5,5 };
delete q;
system("pause");
return 0;
}
结果为:
Constructor calledConstructor called
Constructor called
Constructor called
Destructor called
请按任意键继续. . .
Destructor called
Destructor called
Destructor called