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之间不能隐式转换了。
  • 相关阅读:
    MyEclipse使用经验总结
    CSDN-markdown编辑器使用简介
    struts2提供的校验器
    JUnit4 中@AfterClass @BeforeClass @after @before的区别对比
    JAVA中文字符编码问题详解 控制台输出
    Statement、PreparedStatement
    struts2 文件上传
    SQL RIGHT JOIN 关键字:语法及案例剖析
    SQL LEFT JOIN 关键字:语法及案例剖析
    SQL INNER JOIN 关键字:语法及案例剖析
  • 原文地址:https://www.cnblogs.com/zywscq/p/5179171.html
Copyright © 2011-2022 走看看