类与对象
Posted 攻城狮66
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类与对象相关的知识,希望对你有一定的参考价值。
类与对象
尤其要注意,声明类的时候一定要在最后面加上分号,因为声明类也算是一种语句。语句结束的时候一定要加上分号的。
构造函数
构造函数是对象在被创建时调用的函数,顾名思义,它的作用是帮助创建一个类的实例,即对象。创建对象本质上和创建简单变量没什么区别,都必须占用存储空间,都有名字,只不过对象更复杂,更智能。
它一般用在初始化对象,动态分配内存上。
一般形式如下:
Human (string InputName = "Adam",int InputAge = "25")
{
//构造函数语句
}
构造函数有默认的,也有重载的(Overloaded)。在一个类的定义中,可以同时存在多个构造函数的定义(或者说实现)。可以有默认构造函数,也可以没有默认构造函数。但是,如果没有构造函数的话,一般要求在实例化对象的同时初始化某些私有变量的值(类似于使用函数时输入的参数)。
比如:
class Human{
private:
string Name;
int Age;
public:
Human(){//没有参数
//构造函数实现
}
Human(string HumansName){//需要初始化一个变量
//构造函数实现
}
Human(string HumansName, int HumansAge){//初始化两个
//构造函数实现
}
}
类似于这样,三个同名的重载的构造函数,能够实现灵活的参数初始化选项。也就使得对象更容易使用了。
析构函数
什么是析构函数?与构造函数相反,它的作用是销毁对象,在对象作用域结束时调用。
~Human()
像这样。
...
~Human(){
cout << "调用析构函数,正在清除..." << endl;
if(Buffer != NULL)
delete [] Buffer;
}
...
上面的析构函数的作用是在对象作用域结束时解除Buffer的内存占用。(Buffer是一个char指针,指向一个C风格string数组的开头)。
析构函数有很多用途,上面提到的只是其中一种。
析构函数只能有一个,不能重载。
没有设置它的话,编译器会自动创建一个dummy(伪)析构函数,但这个dummy不释放用new命令动态分配的内存。
浅复制与深复制
浅复制指的是直接把对象当参数传递到函数中。这样,函数会创建一个新对象,但是这个新对象的内存地址与作为实参的对象的内存地址是一样的。这本身不会导致程序崩溃。但是,因为有两个对象,会调用两次析构函数,所以会delete两次,但是同一个内存是不能被delete两次的。所以程序会崩溃。
void UseMyString(MyString Input){} //这是浅复制
相比之下,深复制就安全得多。深复制时,函数会在另外一个内存空间创建一个复制的对象。下面是通过设置一个复制构造函数来实现的。因为函数会创建一个复制的对象,这个新的对象需要一个构造函数。
MyString(const MyString& CopySource) //这是深复制
{ //const 表示不允许改变原来的对象
} //符号 & 表示引用
...
//然后是函数的定义,可见这里的定义与浅复制是是一样的
void UseMyString(MyString Input){}
//但不同的是传对象进去时,因为有“复制析构函数”的存在,会创建另外的空间
另外一种深复制的方法是,先实现复制赋值运算符,然后直接令新对象等于就对象。But, that‘s another story at Chatpet 12.
移动构造函数
???
以上是关于类与对象的主要内容,如果未能解决你的问题,请参考以下文章