笔记一 导读

一、声明

  所谓声明,是用来将一个object、function、class 或 template 的类型名称告诉编译器。声明并不带有细节 信息,一下都是声明:

extern int x;            //object declaration
int numDigits(int num);  //function declaration
class Clock;             //class declaration
template<class T>           
class SmartPointer;      //template declaration

二、定义

  所谓定义,是用来将细节信息提供给编译器。

  对object而言,其定义式是编译器为它分配内存的地点;

  对于function或function template而言,其定义式提供函数本体;

  对于class 或 class template 而言,其定义式必须列出该class或者template的所有members;

四、默认构造函数 default constructor

  通常当你需要定义对象数组时,就会需要一个default constructor.  

class A {
public:
    A();          //default constructor.

};
A arrayA[10];     // call default constructor ten times.

class B {
public:
    B(int x = 0); //default constructor
};
B arrayB[10];

class C {
public:
    C(int x);    //not default constructor.
};

C arrayC[10];    //error.

附带一提,如果你想要产生一个对象数组,但该对象数组类型没有提供default constructor,通常的做法是定义一个指针数组取而代之。

五、初始化与赋值

  对象的初始化发生在它初次获得一个值的时候。对于带有constructor的类或者结构体,初始化是经由调用某个constructor达成的。这和对象的赋值动作有所不同,后者发生于“已初始化之对象被赋予新值”的时候。

  Constructors通常必须检验其引数的有效性,而大部分赋值运算符不必如此。另一方面,在新资源可被赋值过去之前,需要先行释放旧资源。

String::String(const char *value) {
    if(value) {
        data = new char[strlen(value) + 1];
        strcpy(data, value);
    }
    else {
        data = new char[1];
        *data = '';
    }
}

String& String::operator = (const String& rhs) {
    if(this == &rhs) {
        return *this;
    }
    delete []data;
    data = new char[strlen(rhs.data) + 1];
    strcpy(data, rhs.data);
    return *this;
}
原文地址:https://www.cnblogs.com/wiessharling/p/3346357.html