C++面向对象编程 (6)

3.如果不允许主调函数修改返回的指针所指向的字符(或者对象),则返回指向const的指针。
记住:绝不返回指向某个数据成员的非 const 指针。否则,不仅会为你带来不必要的麻烦,而且,还会把实现数据暴露给客户,从而削弱了抽象,破坏了数据封装。
空指针能指出函数本应返回的值出现问题或不存在(如上面示例中的GetNameOfPerson)。这就是为什么从函数返回指针很常见的原因之一。

4.如果要返回一个基本类型(char、int、long等),那么,按值返回和按引用或指针返回效率相同。但是,按值返回较为安全和容易,而且易于理解。

5.要尽可能避免从函数返回引用。

6.如果希望从函数多态返回,唯一的选择就是返回引用或者指针。

新建一个类需要做的事

属性

方法

默认构造函数

含参构造函数

复制构造函数

赋值运算符重写

相等性判断(可选)

有效性判断(可选)

function object(括号复写,可选)

get()/set() (属性控制,可选)

class Agent { Agent(); Agent(Agent const&); Agent& operator=(Agent const&); bool operator==(Agent const&) const; bool operator!=(Agent const&) const; template <typename T_Lambda> bool schedule(T_Lambda const&) const; bool isAvailable() const; } 对象及初始化 对象的标识 main() { TPerson person0(“Albert Einstein”, 0, 0, “12-11-1879”); TPerson person1(“12-11-1879”); TPerson* person2 = new TPerson(“10-11-95”); // 动态对象 TPerson* person3 = new TPerson(“6-27-87”); TPerson* person4 = 0; // 未指向person TPerson* person5 = 0; // 未指向person person1.SetName(“Albert Einstein”); person2->SetName(“Foo Bar”); person4 = person3; // 参见下图 }

对象的标识

显然,对象person1是一个独立的对象,它的名称为person1。但是,person2不是对象真正的名称,它表示内存中另外创建的一个无名称的对象。类似地,person3也表示内存中无名称的另一个对象。在涉及 person2 所表示的对象名时,我们可以通过 *person2 间接地表示的该对象名。
在该例中,识别对象很容易,但并不是通过它们的名称来识别。严格来说,只有person0和person1是对象的名称。而person2、person3是指向内存中匿名对象的指针,person4和person3都表示相同的对象。
记住,person3指定了一个唯一的对象。此时,该对象获得了一个名为person4的别名。现在,如果我们操作person3或person4所表示的对象,实际上是在操作同一个对象。实际上,我们现在已经在两个名称之间共享了一个对象,即共享了对象的结构(因此也共享了状态)。

初始化

初始化是在创建变量(或常量)时,向变量储存已知值的过程。这意味着该变量在被创建(无论以何种方式)时即获得一个值。
如果在创建变量时未进行初始化:

int i;

根据C++(和C)中的定义,i中的值是未定义的。该值就是在创建i的内存区域中所包含的值(在运行时栈上),没人知道是什么。

一定要记住,用合适的值初始化对象的所有数据成员。

默认情况下,C++编译器不会初始化对象的任何数据成员。即使是类的默认构造函数,也不会为对象的数据成员储存任何预定义的值。

使用初始化语法是初始化内嵌对象和const变量的唯一方法,同时初始化语法也可以用于初始化普通变量。

深复制

术语浅复制和深复制源自Smalltalk,这些术语通常用于描述复制语义。一般而言,深复制操作意味着递归地复制整个对象,而浅复制则意味着在复制对象的过程中,源对象和副本之间只共享状态(只传递值)。
如果对象不包含任何指针和引用,浅复制完全满足需要。
对于指针,浅复制只是复制了指针(地址),即创建了指针别名,而我们希望在复制操作完成后,源对象和目的对象之间不会共享任何东西。
每个类都需要提供具有深复制的复制构造函数和赋值运算符。

深复制样例:

class CA { private: int a; char *str; public: CA(int b,char* cstr) { a=b; str=new char[b];//深复制--分配内存 strcpy(str,cstr);//深复制--转移内容 } ... }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjdxx.html