zoukankan      html  css  js  c++  java
  • 《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之间不能隐式转换了。
  • 相关阅读:
    第二阶段冲刺记录八
    用户体验评价
    找水王
    第二阶段冲刺记录七
    第二阶段冲刺记录六
    第14周学习进度
    第二阶段冲刺记录五
    第二阶段冲刺记录四
    第一阶段意见评论
    IP协议号大全
  • 原文地址:https://www.cnblogs.com/zywscq/p/5179171.html
Copyright © 2011-2022 走看看