C++Primer学習ノート--基本概念とデータ型

7395 ワード

目次
1.接尾辞名...1
2.include前処理インジケータ...1
3.条件インジケータifndef.2
4.コンパイラが事前処理名を自動的に定義...2
5.      assert. 2
6.標準エラー...3
7.動的メモリ...3
8.インライン関数inline.3
9.参照とポインタ...4
10.異常処理...5
11.ネームスペースNamespace.5
12.定数...6
13.C++キーワード...6
14.変数の初期化...7
15.0の理解...8
16.constポインタの理解...8
17.boolタイプ...8
18.enumタイプ...8
19.配列...9
20.vectorタイプ...9
21.pairタイプ...9
 
 
 
1.接尾辞名
C++ソース・プログラム・ファイルの接尾辞名は、製品によって異なります.
Unixシステムではtext.c習慣的にC++ソースファイルとされる
C++ヘッダファイル接尾辞名は製品によって異なります.
標準C++ヘッダファイル、接尾辞名なし
 
2.include前処理インジケータ
preprocessor include directive
<>:ファイルがエンジニアリングまたは標準ヘッダであることを示します.
""":ユーザーが提供するヘッダファイルは、まずプロジェクトで検索されます.
 
3.条件インジケータifndef indef
#ifndef SOME_STRING

#define SOME_STRING

#else

//some code

#endif


 
4.コンパイラ自動定義前処理名
C++プログラムをコンパイルすると、コンパイラは自動的に前処理名を定義します:_cplusplus
Cプログラムをコンパイルすると、コンパイラは自動的に前処理名を定義します:_stdC__
__LINE__: レコードファイルがコンパイルされたロー数
__FILE__: コンパイル中のファイルの名前
 
__TIME__: 現在コンパイルされているファイルのコンパイル時間hh:mm:ss
__DATE__: 現在コンパイルされているファイルのコンパイル日Oct 5 2011
 
5.       assert
assert()は、C言語標準ライブラリで提供される汎用プリプロセッサマクロです.
 
#include 


C++で#include(これは汎用的な変換基準であり、.h接頭辞cを除く)
#include 

using namespace std;//      ,  ,assert     


 
図1システムプリコンパイル名
 
6.標準エラー
cerr
cerr  << "This is my error" << endl;


 
7.動的メモリ
動的オブジェクト,すなわちnewから出てきたオブジェクトは,名前がなく,ポインタで間接的に操作する.
 
8.インライン関数inline
関数をインライン関数として定義するには、グローバル関数と、その関数が宣言または定義されたときにキーワードinlineを前に付けるだけの2つの方法があります.クラスのメンバー関数では、関数の実装がクラス内にある場合、その関数はinline関数としてデフォルト設定され、関数の実装がクラス外にある場合は、グローバル関数のようにキーワードinlineを付けるだけでよい.
最後に注意しなければならないのは、1つの関数をinline関数として宣言したり定義したりしても、その関数が必ずコンパイラによってインライン関数として処理されることを保証することはできません.インライン関数として処理することを提案することしかできません.例えば、関数体が大きい場合、コンパイラは基本的にインライン関数として処理しません.これは,この関数を頻繁に呼び出すことでプログラムコード体積の極速膨張を招き,メモリの小さいマシンでは命令キャッシュ装置のヒット率に影響を及ぼす.
 
図2正しいinline
setaは自動的にinline関数とみなされます
CPPでget 2 Aを実装すると、上図のようにコンパイルエラーが発生します.
 
マクロ定義:プリプロセッサ処理
inline:コンパイラ処理
 
9.参照とポインタ
i.ポインタはメモリを指し、その内容はメモリのアドレスを指す.参照は、メモリの別名です.
       ii.ポインタはエンティティであり、参照は別名のみです.
iii.参照使用時に参照を解く必要はありません(*)、ポインタは参照を解く必要があります.
iv.参照は定義時に一度だけ初期化され、その後は可変ではない.ポインタが可変です.
v.参照は空ではなく、ポインタは空であってもよい.
vi.「sizeof参照」は指向する変数(オブジェクト)の大きさであり、「sizeofポインタ」はポインタ自体(指向する変数またはオブジェクトのアドレス)の大きさである.typeid(T)==typeid(T&)は真であり、sizeof(T)==sizeof(T&)は真であるが、メンバーとして参照する場合、その占有空間はポインタと同じである(標準的な規定は見つからない).
    vii.ポインタと参照の自己増加(++)演算の意味が異なる.
図3の出力結果は4
 
図4参照とポインタ定義
 
 
図5タイプ変換を用いない参照
図4から分かるように、bをconstとして定義しなければ、bが変化した場合、aの値に影響を及ぼすことはなく、参照の概念ではない.constとして定義されると、bは読み取り専用であり、bはaのアドレスをかなり保存しているのか、参照しているのか.
10.異常処理
void fun() throw(int,string){…}
 
11.ネームスペースNamespace
図6ネーミングスペース
質問:同じ名前のクラスを1つのプロジェクトに複数作成し、異なるNamespaceに配置する方法
別名:Namespace newName=oldName;
図7ネーミングスペースエイリアス
 
12.定数
C++言語はconstで定数を定義してもよいし、#defineで定数を定義してもよい.しかし、前者は後者よりも多くの利点があります.
(1)const定数にはデータ型があり、マクロ定数にはデータ型がありません.コンパイラは前者に対してタイプセキュリティチェックを行うことができます.後者に対しては文字置換のみを行い、タイプセキュリティチェックはなく、文字置換
予期せぬエラー(境界効果)が発生する可能性があります.
(2)統合されたデバッグツールによってはconst定数をデバッグできますが、マクロ定数をデバッグできません.
【ルール】C++プログラムではマクロ定数を使用せずにconst定数のみを使用します.すなわち、const定数はマクロ定数を完全に置き換えます.
図8定数
 
13.C++キーワード
図9 C++キー
 
14.変数初期化
int、doubleの場合:
グローバル変数、コンパイラは初期値0を割り当てます.
ローカル変数は、初期値を手動で割り当てる必要があります.(newで出てくる変数も同じ)
charの場合:
グローバルとローカルは0(ASCIIコード)
図10変数初期値
 
15.0の理解
const char* p = “Hello world”;


最下位は0なので、
while(*p++)//++      *


:ポインタを後ろに移動し、その内容を取り出します.
:文字列が終了すると、falseという条件が0になります.
 
16.constポインタの理解
constキーワードの後に続くのは変更できません.
const char* str = “Hello Everyone!”;


char*が変更できないことを示す、すなわちstrポインタが指すメモリブロックの内容が変更できない、すなわち「Hello Everyone!」変更できませんが、str自体は変更できます.別のメモリ領域を指すことができます.
(次のように)
char* str1 = “Hello World”;

str = str1; //           ,  "Hello Everyone!”              ,    。

//str[0] = ‘a’; //  ,         


)
char* const str = “Hello Everyone!”;


strが変更できないことを示す.すなわち、strポインタが保存しているアドレスは変更できず、一定のメモリブロックを指し続けるしかないが、このメモリブロック自体の内容は変更できる.しかしstrポインタが指すメモリブロックの内容は変更できます.
(次のように)
str[0] = ‘0’;//  

char* str1 = “Hello World”;

//str = str1;//  ,str        ,              。



)
 
17.boolタイプ
1)typedefやenumなどでシミュレートしたboolタイプではなく、内蔵boolタイプを使用するのはなぜですか?
lプログラムの可読性が良い!
lコンパイラにコードを最適化する機会を与える.
内蔵boolタイプは一般的に1バイトです.
一部のCPUはboolタイプをメモリのビットに最適化する
2)C言語のboolタイプ
18.enumタイプ
1)1つの要素は1つのenumでしか定義できません.そうしないと、エラーが発生します.
2)++操作なし
   
WeekDay day = Tuesday;

day++;//Error,No Operator ++ for day


 
3)直接型値を割り当てることはできない
WeekDay day;

day = 1;//Error,Cannot Convert int to enum 


4)戻り値はインデックス値
WeekDay day = Monday;

cout << day << endl;         //   0


5)後の要素のデフォルトインデックス値は常に前の要素のインデックス値+1
enum WeekDay{Monday=1,Tuesday,Wednesday=1,Thursday,Friday,Saturday=9,Sunday};


各要素のインデックス値は、1,2,1,2,3,9,10の順になります.
 
19.配列
1)C++コンパイラは配列下表に対して境界検査を行わない
2)配列間で直接値を割り当てることはできません
int a[4] = {1,2,3,4};

//int b[4] = a;//Error


 
20.vectorタイプ
arrayの代わりにvectorを使用することをお勧めします.特にarrayを使用する必要がない限り.
/************************************************************************************************
 *     : main.cpp
 *     :  C++ Premier     Vector
 *     : 
 *     :JarvisChu
 *     :2011-7-3    ;7-4   ;
 *************************************************************************************************/
#include 
#include 
#include 

using namespace std;

int main()
{
    //      
    vector arrNum(10);        //         10 vector,       0
    arrNum[0] = 10;
    arrNum[1] = 11;
    cout< stlNum;
    stlNum.push_back(10);
    stlNum.push_back(11);
    stlNum.push_back(12);
    cout< stlNum_1 = stlNum;  //       
    cout<::iterator it;                   //       vector
    for(it = stlNum.begin(); it != stlNum.end();it++){
        cout<

 
21.pairタイプ
2つのタイプの同じ値または異なる値を、単一のオブジェクト内で関連付けます.
 
/************************************************************************************************
 *     : main.cpp
 *     :  C++ Premier     pair
 *     : 
 *     :JarvisChu
 *     :2011-7-4   
 *************************************************************************************************/
#include 
#include 

using namespace std;

typedef pair PERSON;

int main()
{
    PERSON me("Jarvis",21);
    cout<

転載先:https://www.cnblogs.com/JarvisChu/archive/2011/07/04/2752468.html