《Effective C++》学习笔记(一)

1.const成员函数不能更改成员变量

#include <bits/stdc++.h>

using namespace std;

class CtextBlock
{
public:
    size_t length() const;
private:
    char* pText;
    size_t textLength;
    bool lengthIsValid;
};
size_t CtextBlock::length() const
{
    if(!lengthIsValid)
    {
        textLength=strlen(pText);
        lengthIsValid=true;
    }
    return textLength;
}

/*/home/zy/文档/C++/practise/zywscq1/main.cpp||In member function ‘size_t CtextBlock::length() const’:|
/home/zy/文档/C++/practise/zywscq1/main.cpp|18|error: assignment of member ‘CtextBlock::textLength’ in read-only object|
/home/zy/文档/C++/practise/zywscq1/main.cpp|19|error: assignment of member ‘CtextBlock::lengthIsValid’ in read-only object|*/


解决方法:利用C++的一个与const相关的摆动场:mutable(可变的)。mutable释放掉non-static成员变量的bitwise constness约束。

#include <bits/stdc++.h>

using namespace std;

class CtextBlock
{
public:
    size_t length() const;
private:
    char* pText;
    mutable size_t textLength;
    mutable bool lengthIsValid;
};
size_t CtextBlock::length() const
{
    if(!lengthIsValid)
    {
        textLength=strlen(pText);
        lengthIsValid=true;
    }
    return textLength;
}

2.const在星号右边表示指针是常量,在星号左边表示被指物是常量。

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

如果被指物是常量,那么将关键字const写在类型之前还是类型之后星号之前是一样的。

void f1(const widget* pw);
void f2(widget const *pw);

3.default构造函数要么没有参数,要么每个参数都有缺省值。

class B{
public:
    explicit B(int x=0,bool b=true);
};

class C{
public:
    explicit C(int x);//不是default构造函数    
};

将构造函数声明为explicit,这可以阻止它们被用来执行隐式类型转换(implicit type conversions),只可以执行显示类型转换(explicit type conversions)。

void gao(B bbb);
B bb1(28);
gao(B(28));
gao(28);//错误,int和B之间不能隐式转换了。

 

posted @ 2016-02-03 10:42  周洋  阅读(339)  评论(0编辑  收藏  举报