《Effective C++》学习笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《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之间不能隐式转换了。
以上是关于《Effective C++》学习笔记的主要内容,如果未能解决你的问题,请参考以下文章