Effective C++ <一> :让自己习惯于C++

1. 视C++为一个语言联邦

C++有四种使用方式
- C
- Object-Oriented C++
- Template C++
- STL
不同部分的高效编程守则是不一样的
C++高效编程守则视状况而变化,取决于使用C++的哪那一部分

2. 尽量以const,enum,inline替换#define

常量的定义一般放在头文件,下面看看两种特殊情况
1. 定义常量指针

const char* const name = "Lily";//const写两次
const string name("Lily"); //这样更好些
  1. class的专属常量
    为了专属class,需要是class的成员;为了不属于某个对象,需要是static
class Game
{
    private:
        static const int kNum = 5;
        int scores[kNum];
}

另一种方案

class Game
{
    private:
        enum {kNum = 5};
        int scores[kNum];
}

inline代替函数形式的宏

3.尽可能使用const

3.1 const表示

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;  //non-const pointer,non-const data

3.2 const成员函数

C++的一个重要特性需要注意,两个成员函数如果只是常量性不同,可以被重载,关于const两种阵营:bitwisw constness(physical constness,自不用说,就是const的本意)和 logical constness。看看如何试下logical constness,用mutuable来实现

class CTestBlock
{
    public:
        std::size_t length() const;
    private:
        char* pText;
        mutable std::size_t textLength;  //这些变量可能被更改,即使在const函数内
        mutable bool lengthIsValid;
}

std::size_t CTestBlock::length() const
{
    if (!lengthIsValid)
    {
        textLength = std::strlen(pText);
        lengthIsValid = true;
    }
    return textLength;
}

3.3 const成员函数和non-const成员函数避免重复

直接看一个例子吧

class TestBlock
{
    public:
        const char& operator[] (std::size_t position) const
        {
            ...
        }
        char& operator[] (std::size_t position)
        {
            return const_cast<char&>(    //将op返回值的const转除 
             static_cast<const TextBlock&>(*this)  //为*this加上const
             [position]     //调用const op[] 
            );
        }
}

千万不要试图实现non-const版本,然后再const版本调用non-const版本。

4.确定对象被使用前已先被初始化

  1. 内置类型初始化
  2. class,初始化落在构造函数,确保构造函数都将对象的每个成员初始化,总是使用初始化列表,class的成员变量总是以其声明的次序初始化
    另外注意如下写法
ABEntry::ABEntry()
:theName(),  //调用theName的default构造函数
 theAddress(),
 thePhones(),
 num(0)
 {}

如果成员变量是reference或const,就一定需要初值,不能被赋值
3. 不同编译单元内定义只non-local static对象
这个麻烦,不说了,见书吧,解决办法如下
请以local static对象替换non-local static对象,并用一函数返回其引用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值