【Effective C++読書ノート】編一(リード~条項01)

2427 ワード

先輩のアドバイスで、「Effective C++」という本を買って、一ヶ月のばらばらな時間で読んで、このコラムで私の勉強の心得を記録するつもりです.
リード
#1
キーワードexplicitは、コンストラクション関数の暗黙的な変換を阻止するために使用されます.
explicitと宣言された構造関数は、non-explicit兄弟よりも一般的に人気があります.コンパイラが予期せぬ(望ましくない)タイプ変換を実行することを禁止するためです.構造関数が暗黙的なタイプ変換に使用されることを許可する良い理由がない限り、explicitとして宣言します.同じ政策に従うことを奨励します.
このキーワードはクラス構造関数でのみ使用できます.例を挙げて説明しましょう.
#include <iostream>

using namespace std;

class boy
{
	public:
		int age;
		boy(int _age):age(_age){}
};

class girl
{
	public:
		int age;
	explicit	girl(int _age):age(_age){}         //   explicit       
};

int main()
{
	boy b1(1);
	boy b2 = 2;

	girl g1(1);
	girl g2 = 2;                                       //    ,error: conversion from ‘int’ to non-scalar type ‘girl’

	return 0;
}

また、コンストラクション関数パラメータが2つを超えると自動的に暗黙的な変換がキャンセルされますが、コンストラクション関数にデフォルト値がある場合は例外です.
例:
#include <iostream>

using namespace std;

class boy
{
	public:
		int age;
		int height;
		boy(int _age = 0, int _height = 50):age(_age), height(_height){}
};

int main()
{
	boy b = 2;
	return 0;
}

このとき暗黙的な変換があり、一意のパラメータがageに与えられます.
ここまで言えば、暗黙的な変換に何か悪いところはありません.ここを参考にすると、explicitは構造関数の暗黙的な変換による誤りや誤解を効果的に防止することができます.http://www.cnblogs.com/cutepig/archive/2009/01/14/1375917.html
#2
「=」等号は、割り当て関数として使用することも、コピーコンストラクタとして使用することもできます.
幸いなことに、「copy構造」は「copy付与」とは簡単に違います.新しいオブジェクトが定義されている場合、割り当て操作ではないコンストラクション関数が呼び出されます.新しいオブジェクトが定義されていない場合、コンストラクション関数は呼び出されません.もちろん、付与操作が呼び出されます.
例を挙げます.
#include <iostream>

using namespace std;

class boy
{
	public:
		int age;
		int height;
		boy(int _age, int _height):age(_age), height(_height){}
		boy(const boy &b){age = 19; height = 170;}
		boy& operator=(const boy &b){age = 21; height = 180;}
		void display(){cout << age << " " << height << endl;}
};

int main()
{
	boy b1(20, 175);
	boy b2 = b1;                       //        
	b2.display();
	b2 = b1;                           //      
	b2.display();                      
	return 0;
}

ガイドの内容を完了し、条項1でこの節の内容を終了します.
条項01:C++を一つの言語連邦と見なす
C++をよりよく理解するために、私たちは4つの部分と見なして、各部分にはそれぞれの規則があります.
1)C
2)Object-Oriented C++
3)Template C++
これはC++の汎用プログラミング(generic programming)部分であり、多くのプログラマーの経験が最も少ない部分でもある.
4)STL
C++の効率的なプログラミングルールは、C++のどの部分を使用するかによって状況が変化することを覚えておいてください.