Effective C++学习笔记(1)

1、explicit防止隐式类型转换,此时只能显式地构造一个类的对象。禁止在函数调用时,传入一个其他类型的参数,从而隐式地构造了一个临时对象,作为函数的参数传入。
隐式类型转换容易引起错误,除非有明确的理由需要使用隐式类类型转换,否则,应该将构造函数声明为explicit。注意:explicit只能用于类内部构造函数的声明。

class BOOK  //定义了一个书类
{
    private:
        string _bookISBN ;  //书的ISBN号
        float _price ;    //书的价格
        
    public:
        //定义了一个成员函数,这个函数即是那个“期待一个实参为类类型的函数”
        //这个函数用于比较两本书的ISBN号是否相同
        bool isSameISBN(const BOOK & other ){
            return other._bookISBN==_bookISBN;
                }

        //类的构造函数,即那个“能够用一个参数进行调用的构造函数”(虽然它有两个形参,但其中一个有默认实参,只用一个参数也能进行调用)
        BOOK(string ISBN,float price=0.0f):_`在这里插入代码片`bookISBN(ISBN),_price(price){}
};

int main()
{
    BOOK A("A-A-A");
    BOOK B("B-B-B");

    cout<<A.isSameISBN(B)<<endl;   //正经地进行比较,无需发生转换

    cout<<A.isSameISBN(string("A-A-A"))<<endl; //此处即发生一个隐式转换:string类型-->BOOK类型,借助BOOK的构造函数进行转换,以满足isSameISBN函数的参数期待。
    cout<<A.isSameISBN(BOOK("A-A-A"))<<endl;    //显式创建临时对象,也即是编译器干的事情。
    
    system("pause");
}

2、尽量以const、enum、inline替代define,因为宏替换不重视作用域。①用const常量替换宏定义的常量;②也可以使用enum设置类的静态常量,如enum { num = 5 }; 该常量和define一样不可以取地址;③用inline替代宏函数。

3、尽可能地使用到const关键字。当你的函数不需要修改各种变量的时候,应该在相应的位置使用const,同时也便于检查程序出错位置。

4、当你想要使用连着做乘法运算(或者连续地赋值操作),并重载*运算符时,应该使重载运算符函数返回引用。
而当你想要让你的函数返回值可以作为左值进行操作时,也应该返回引用。比如:

char& operator[](std::size_t position){return text[position];};

5、①对于const另一个值得注意的事情是,在成员函数内部,const仅不修改对象的成员变量。当这个变量是指针时,const仅保证不去修改这个指针的值,而指针所指的内容可能被修改。
②假如想要在const成员函数中修改对象的成员变量,应该对这个变量使用mutable关键字指明。

6、const和non-const存在代码重用。常见的做法是non-const调用const时,使用const_cast去掉其常量性。

class Text
{
	private:
		char* text;
	public:
		const char& operator[](int position) const
		{
			return text[position];
		}
		char& operator[](int position)
		{
			return const_cast<char&>(static_cast<const Text&>(*this)[position]);//先把*this转为const Text& 类型,防止其自己调用自己而陷入死循环,然后调用重载的const的[]运算符,再通过const_cast去掉其常量性
		}
};
		

7、确定对象在使用前已被初始化。
对于构造函数,尽量使用成员初始化list来初始化其成员变量。
如果在函数内部进行赋值形式的初始化,将会先调用默认的构造函数,为成员变量赋默认值,进入函数内部后,又立刻使用其他值拷贝给成员函数,从而造成较低的效率。
初始化的顺序将总是按照声明的顺序进行。

8、static对象,生命期从被构造开始到程序结束。通常包括全局对象,名字空间中的对象、类内部、函数内部或文件作用于内带static关键字的对象。函数内部的static对象为局部的static对象,其对函数而言是局部的,其他的static对象为非局部的static对象。

发布了8 篇原创文章 · 获赞 3 · 访问量 182

猜你喜欢

转载自blog.csdn.net/Longstar_L/article/details/105218849