effective c++学习笔记

来源:互联网 发布:流程管理 软件 hr软件 编辑:程序博客网 时间:2024/04/30 00:15

1.item3 p18:

如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。

char greeting[] = "Hello";

char* p = greeting;                                                   // non-const pointer,non-const data

const char* p = greeting;                                        // non-const pointer,const data

char* const p = greeting;                                        // const pointer,non-const data

const char* const p =greeting;                              // const pointer,const data


const 成员函数:
任何不会修改数据成员的函数都应该声明为const 类型。如果在编写const 成员函数时,不慎修改了数据成员,或者调用了其它非const 成员函数,编译器将指出错误,这无疑会提高程序的健壮性。


2.item5  p34

1)

如果你自己没有声明,编译器就会为它声明一个copy构造函数,一个copy assignment操作符和一个析构函数。此外如果你没有声明任何构造函数,编译器也会为你声明一个default构造函数。所有这些函数都是public其inline。

class Empty { };

==

class Empty{
public:
    Empty(){}
    Empty(const Empty & rhs){}
    ~Empty(){}


    Empty& operator=(const Empty& rhs){}

};

2) C++并不允许让reference改指向不同对象

类中有reference和const成员,必须在构造函数中进行初始化?

reference成员必须在初始化列表方式进行初始化,而且参数应该为引用,因为如果这里不用引用,则到时候引用的将不是传入的参数,而是临时变量(形参),构造函数结束后临时变量销毁,再使用reference成员可能会是一个不可预料的数

Rational(int numerator, int denominator, int& value):n(numerator),d(denominator),ref(value){}


3.item07 p43

声明一个纯虚析构函数时,需要提供一份定义

class AWOV
{
public:
    virtual ~AWOV() = 0;
};


AWOV::~AWOV(){}

 因为在析构时,derived class的析构函数后会调用base class的析构函数。如没有,链接器会报错。


4.item13 p64

std::tr1::shared_ptr<T>不是C++11中的,是tr1的,如果要用需要包括#include <tr1/memory>

C++11中使用的是std::shared_ptr<T> ,如使用,需要编译器支持C++11


5.item24 p104

只有当参数被列于参数列(parameter list)内,这个参数才是隐式类型转换的合格参与者。

class Rational
{
public:
    Rational(int numerator = 0, int denominator = 1){}


    const Rational operator* (const Rational& rhs) const
    {
        return Rational();
    }
};


int main()
{
    Rational oneHalf;


    Rational result = oneHalf * 2;    //成功
    result = 2 * oneHalf;                    //编译报错
}


应使用non-member函数替换上面的operator*成员函数

const Rational operator*(const Rational& lhs, const Rational& rhs)
{
    return Rational();
}


6.item33 p161

derived classes内的名称会遮掩base classes内的名称。---是指在derived classes视角来说,如果是从base classes多态视角来说,则不存在遮掩。


输出结果为:

Derived mf1()
Base mf2()
Derived mf3()
Derived mf1()
Base mf1(int)
Base mf3()
Base mf3(double)


7.绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定,而virtual函数却是动态绑定。


输出结果为:

0
0
1
1

0 0
原创粉丝点击