効果的なC ++(〜4 1)

連邦政府へのC ++言語として1、

言語のフェデレーションとして表示C ++

我々はすべて知っているように、C ++は進化し、C言語です。したがって、C ++言語は、互換性のあるC言語である必要があり、言語は、他のオブジェクト指向言語C ++ C言語でも継承された欠陥に比べて、プロセス指向言語Cです。
C ++言語、その時代のクラスで、それはまだオブジェクト指向言語、他の「インセンティブ」によるオブジェクト指向言語で、C ++言語は常に変化している欠陥がある一方で、いないC ++言語C。「効果的なC ++は」本は言った、C ++は、「連邦政府の言語」です。今日、一般的に次のセクションに分かれて、強力なC ++言語:

  1. C:ブロック、ステートメントは、前処理、組み込みデータ型、欠陥がCには、テンプレート、ノーオーバーロード、例外ではありません。
  2. C ++ -オブジェクト指向:それは、クラス、継承、多型、カプセル化、仮想関数で付きアピールCの一部である(動的結合)
  3. C ++テンプレート:ジェネリックプログラミングのセクション、効率的な手順は、シナリオ、プログラムパラメータの様々な種類の様々な適用です。テンプレート関数は、テンプレートメタプログラミング(TMPテンプレートメタプログラミング)である新しいプログラミングパラダイムを、もたらし、非常に強力です。
  4. STL:C ++プログラマーとしてSTLのいくつか把握している必要があり、STLは、優れた協力とコンテナの調整、アルゴリズム、イテレータ規程関数オブジェクトを持っています。
  • ケースとして効率的なコードC ++プログラミングが書き込まに対応するプログラムの一部と見なされる必要があり得ます。

可能な限りのconst、列挙型、インライン交換#defineと2

#defineにconsts、列挙型、およびインラインを好みます

マクロのために、私たちは知っている、それは単にマクロ置換は、前処理段階で発生し、表現の置換プロセスが原因で、演算子の優先順位の予期しないエラーの問題を引き起こす可能性が代わる、機能マクロではありません。

# define PI 3.14

数学の問題は、PI、私たちは多くの場合、上記で定義されたマクロを使用するC言語に遭遇しました。このコードを開始し、我々は代わりに3.14 PI演算のため、コードは、後続の複数の3.14に表示されますされています。私たちは、多くの場合、冗長データを計算するために変数を使用し、一定の変数をconstの定義を使用する場合と存在しません。

const float PI=3.14;

クラス内のメンバーは、我々はまた、#はマクロが定義されると、彼は、その後のコンパイル処理に有効であった、何のスコープの制限を定義しない、constの定数引数を定義する必要があります。ないだけの#defineのカプセル化を提供することはできません、クラス固有の定数を定義するのに使用することができない、constが、これらの問題を持っていないでしょう。

class A{
private:
	static const float PI;
};
static const float A::PI=3.14; 

私たちのクラスは、一定の必要性を維持するために専用の場合は、はい、私たちは、静的な、静的メンバーは、この時間は、クラスのメンバーの定数を初期化するために列挙ハックを使用して達成することができ、クラスの外で初期化する必要があります追加する必要があります。

class A{
private:
	enum{PI=3.14};
};

この状況は、アドレスが間違って取得します列挙型オブジェクトのアドレスを取ることができません。
実際には、マクロの使用もエラーにつながる副作用があるかどうかに注意を払う必要があります。ここでは、についてですマクロの概要

  • 単純な定数の、列挙好ましくconstオブジェクトにまたは代替的に#define
  • マクロ関数の形状のために、使用することは、好ましくは、インライン関数の#defineに置換され

3つの可能な使用のconst

可能な限りのconstを使用します

  1. 多くの場合、多くの場合、変数、定数、変数の定数ポインタをポインタ
#include<iostream>
int main()
{
	int a = 10;
	const int* p1 = &a;//指向常变量的指针p1,不能通过p1改变a的值,p1可以指向其它地方
	int* const p2 = &a;//常指针p2,只能指向b
	const int* const p3 = &a;//指向常变量的常指针,p3只能指向b,不能通过p3改变b的值
}
  1. const_iteraor与えられたconst T*ポインタの種類、あなたがすることができないconst_iterator要素の内容を変更します。ステートメント定数イテレータT* constポインタ、反復子は(ない+または- )を移動することができません。
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str({"I love C plus plus..."});
	const string::iterator it1 = str.end();//it1只能指向str的尾元素位置,不能移动
	string::const_iterator it2 = str.begin();//it2可以指向其它位置,it2具有只读权限
	while (it2 != it1)
	{
		cout << *it2;
		it2++;
	}
	cout << endl;
	return 0;
}
  1. 機能を割り当てることがしたくない値を返す場合は、const型として宣言することができます。これは、外の世界の事故のいくつかを回避することができます。
#include<iostream>
using namespace std;

class Rational{
public:
	const Rational operator*(const Rational& r){}
};
int main()
{
	Rational a, b, c;
	//(a*b) = c;这种暴行就会报错
	return 0;
}
  1. 2つのメンバ関数は、定数のみ異なる性質た場合、過負荷状態にすることができます。
#include<iostream>
#include<string>
using namespace std;

class Text{
public:
	char& operator[](size_t pos)//non-const对象
	{
		return str[pos];
	}
	const char& operator[](size_t pos)const//const对象专属
	{
		return str[pos];
	}
private:
	string str;
};
int main()
{
	Text text;
	const char c1 = text[0];
	char c2 = text[0];
	c2 = text[2];
	return 0;
}
  1. 論理的const性和ビット単位のconst性
  • また、物理的const性として知られているビット単位のconst性、オブジェクトはメンバ変数のいずれかを変更しない場合にのみ、メンバ関数を考えるには、つまり、1つのビットが変更されることはありません、constの言うことができます。constメンバ関数は、オブジェクト内の非静的メンバ変数を変更することはできません。だから、constメンバ関数が存在することはできません=それ以外の場合はエラー、。
  • インスタンス、constメンバ関数は、我々はそれが知っている=オブジェクトの内容を変更することはありません、我々はそれを変更可能な特性を与える、変数に代入する必要があります。我々が続いているこの時間は、論理的const性、すなわちその論理定数のです。
  1. 非constバージョン、のconstを呼び出すコードの冗長性を削減
class Text{
public:
	const char& operator[](size_t pos) const		//const对象专属,不会改变
	{
		return str[pos];
	}
	char& operator[](size_t pos)
	{
		return const_cast<char&>(static_cast<const Text&>(*this)[pos]);
	}
private:
	string str;
};

(static_cast<const Text&>(*this)ポインタCONST型にこれを変換し、コールは[ ]、メンバ関数の呼び出しをconst型であろうconst char&、使用はconst_cast除去CONST属性。

なぜ呼ん非constメンバ関数はconstメンバ関数を使用していない? constメンバ関数は非constメンバ関数は、オブジェクトの内容を変更する場合は、constメンバ関数を、彼はオブジェクトの内容は変更されませんが、それは非constメンバ関数を使用することをお約束します彼はミスを犯しました。

  • コンパイラは、ビット単位のconst性は、プログラミング時間を使うべき強制「のコンセプトの定数を。」
  • 非constバージョンはCONSTを呼び出すようにするときのconstと非constメンバ関数は、実質的な等価物を有しています。

それが初期化されている前に、オブジェクト4を使用して決定します

彼らが使用している前に初期化確かに作るされているオブジェクト
の初期化を保証するものではありません(STL配列に)パートC ++のCは、Cの非C ++( STL ベクトル)は、その初期化を確実にします。
そのため、エラーを回避するために、ベストタイムは、オブジェクト定義で直接それを初期化します。

  1. コンパイラの初期化シーケンスは、オブジェクトの宣言順序に従って開始されます。栗:あなたは、配列の初期サイズを初期化する必要があります前に。
  2. コンストラクタは、初期化リスト内のすべてのオブジェクト漏れを防ぐために、宣言順に初期化されるのがベストです。割り当てられた理由は、コンストラクタ内ではない、コンストラクタ関数の本体を行う前に、効率を改善し、不要な動作を避けるために、初期化する初期化リストを実行します。
class First_name{};
class Last_name{};
class  Person
{
public:
	Person()
		:first_()
		, last_()
		, age_(20)
	{}

private:
	First_name first_;
	Last_name last_;
	int age_;
};
  1. 問題「初期化順序のクロスコンパイル単位」の除去のために、地元の静的オブジェクトと非ローカルオブジェクトを置き換えます。

静的関数内のオブジェクトがローカル静的オブジェクト、のみインビボでの機能の範囲と呼ばれ、非ローカル静的オブジェクトと呼ばれる他の静的オブジェクト、それらは時間の主な機能の終了時に破壊されます。

2以上の非ローカル静的オブジェクトの関数をコンパイルするときに、非ローカル静的オブジェクトの初期化が原因で異なるコンパイル単位で「非ローカル静的オブジェクトのC ++定義、別の非ローカル静的オブジェクトに依存して、前記単位時間を存在「初期の相対的な順序は明確に定義されていません。シングルトンモード:エラーが間違った方法は、ローカルの静的な非ローカル静的オブジェクト、典型的な例の代わりに使用することを避けるために、存在していてもよいです。

  • C ++はそれらを初期化し保証するものではありませんので、手動で初期化され、組み込みのオブジェクトの。
  • コンストラクタではなく、コンストラクタの割り当てよりも、宣言順を初期化する初期化リストを使用するのが最適です。
  • 問題「初期化順序のクロスコンパイル単位」の除去のために、地元の静的オブジェクトと非ローカルオブジェクトを置き換えます。

おすすめ

転載: blog.csdn.net/Vickers_xiaowei/article/details/93408811