effective C++ 读书笔记(5-10)

1:

   C++ 不允许让reference 更改指向的对象

   int main()

{

string value("wangshuai");

string &a = value;

cout<<&a<<endl;

string minhua("wuawuawua");

a = minhua;

cout<<&a<<endl;

cout<<value<<endl;

cout<<minhua<<endl;

return 0;

}

输出结果:

0x22ff04

0x22ff04

wuawuawua

wuawuawua

2: 父类将其cpoy构造函数 assign构造函数声明为private 的 

    则编译器拒绝为其子类声明默认的copy& assign构造函数

3: 将成员函数声明为private 而故意不去实现他们!

        一个小trick 可以阻止 member 函数 friend函数 等其它函数调用它们

        在link的时候出错

4: priavte继承

不管是什么继承,子类中都可以访问父类中所有public和protected的成员。

private继承只是表明继承关系是private的,而不表明所有成员的访问权限也是private的,这完全是两码事。
讲得通俗点,private继承是指“外界”不知道那个类还有个父类,而不是子类自己也不知道他有个父类。就像私有成员一样,外界不知道类有私有成员,不代表类自己也不了解自己的私有成员。

5:

 C++明白指出,当派生类的对象经由一个base class 指针删除,而该base class带着一个non-virtual 的析构函数 其结果没有定义

 通常是 她的派生成分没有被删除

这造成了 “局部销毁” =》 资源泄露 破坏堆栈

 6:

  切记 不要继承 STL中的类 std::string 等等

 因为他们的析构函数是非虚的 

不过这种情况是可以编译过的。。。 C++没有提供类似于Java(final classes) 或C#(sealed classed )这种机制

7:

 pure virtual 函数导致abstract classes  该类不能被实例化

class pured

{

public:

pured(){};

virtual ~pured()=0;

};

int main()
{
pured a;    //  ..\main.cpp:36:8: error: cannot declare variable 'a' to be of abstract type 'pured'
return 0;
}
并且子类必须实现 父类的纯虚函数
8:
析构函数绝不能抛出异常
class exception
{
public:
~exception()
{
try
{
throw 1;
}
catch(...)
{
//log
std::abort();
}
};
};
std::abort(): 强行终止一个进程,以一个非常粗野的方式来完成这个工作。

9:
 不要在构造函数 与 析构函数中 调用 virtual 函数 它只能导致调用base class 的函数
10
  A & operator = (const A& a){};  
 另operator = 返回一个reference * this  这样子比较符合标准
 11:  
     注意
as & operator =(int a)
{
cout<<"operator"<<endl;
return *this;
  }
这是不行的   报错 error: conversion from 'int' to non-scalar type 'as' requested
as & operator =(const as & a)
{
temp = a.temp;
return *this;
}      好像只有 = 左右的类型 相同 或者 可以直接转化 才可以 这样子赋值

posted @ 2011-09-07 16:52  王帅901  阅读(443)  评论(0编辑  收藏  举报