码迷,mamicode.com
首页 > 其他好文 > 详细

类与对象

时间:2017-12-09 00:45:49      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:string   out   cout   清除   class   赋值   lock   定义   amp   

类与对象

尤其要注意,声明类的时候一定要在最后面加上分号,因为声明类也算是一种语句。语句结束的时候一定要加上分号的。

构造函数

构造函数是对象在被创建时调用的函数,顾名思义,它的作用是帮助创建一个类的实例,即对象。创建对象本质上和创建简单变量没什么区别,都必须占用存储空间,都有名字,只不过对象更复杂,更智能。
它一般用在初始化对象,动态分配内存上。
一般形式如下:

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.

移动构造函数

???

类与对象

标签:string   out   cout   清除   class   赋值   lock   定义   amp   

原文地址:http://www.cnblogs.com/gnaijdivad/p/8007531.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!