C++学習ノート--データ型

5770 ワード

毎日少し時間をかけて、再びC++を拾って、いくつかの学習ノートを記録して、内容は自分の理解によって次第に更新します.
1.ポインタ
私たちが最もよく知っているのは、1バイトが8ビットで構成され、1文字が32ビットで構成されていることです.これは32ビットのオペレーティングシステムに対してです.実は、字の大きさは機械に依存しています.C++基本データ型、int/short/long/float/double/long doubleの長さは、shortが半文字、intが1文字、doubleが2文字で、具体的には何ビットのデータを表すことができますか.どの程度の範囲の値を格納できるかは、オペレーティングシステム環境によって異なります.
文字定数はアドレスできません.変数はできます.一例に従ってポインタとアドレスの記憶空間の変化を学習する.

#include "iostream"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	/* ival      */
	/* pi  ival   */
	/* ppi  pi  ,       */
	/* *ppi pi        */
	int ival = 1024;
	int *pi = &ival;
	int **ppi = π

	cout << "The value of ival
" << "direct value: " << ival << "
" //1024 << "indirect value: " << *pi << "
" //1024 << "double indirect value: " << **ppi << "
" //1024 << "value of *ppi: " << **ppi << "
" //1024 << endl; /* pi 2 , , 2×4 =8 */ pi = pi + 2; cout << pi; return 0; }

2.文字列
Cスタイルの文字列と標準C++stringタイプで、前者は標準C++の一部である標準Cライブラリであり、後者は標準C++が提供するstringクラスであり、主にCスタイルの文字列を記述する.
文字列が空の定義:

char *pc1 = 0;
char *pc2 = "";

Cスタイル文字列の文字ポインタは常に関連する文字配列を指しており、自増で空文字を終了した後、この場所でエラーが発生しやすい.

#include "iostream"
using namespace std;
const char *st = "The expense of spirit
"; int _tmain(int argc, _TCHAR* argv[]) { int len = 0; while ( *st++ ) ++len; /* st */ /* len 1 */ st = st - len; /* "he expense of spirit" */ cout << len << ": " << st; return 0; }

ポインタを1つだけ増やしてst長を計算できます

const char *p = st;

文字ポインタの下位特性により、文字列を表すのにエラーが発生しやすいため、C++標準ライブラリは文字列クラス抽象の共通実装を提供し、stringタイプを使用するにはヘッダファイルを含む必要があります.

#include "string"

3.constキーワード
「const以外のオブジェクトのポインタを定数オブジェクトに指そうとする」という動作は、コンパイルエラーを引き起こし、constオブジェクトのアドレスはconstオブジェクトを指すポインタにしか値しませんが、constオブジェクトを指すポインタはconst以外のオブジェクトのアドレスに割り当てることができます.
この3つの違いに注意してください.

/*   double   ,   const      */
const double *pc = 0;
const double minWage = 9.60;
pc = &minWage;
/*   int   const   */
int errNumb = 0;
int *const curErr = &errNumb;
/*   double   ,   const   const   */
const double pi = 3.14159;
const double *const pi_ptr = &pi;

このコード:

using namespace std;
const int ival = 1024;
const int *const &pi_ref = &ival;
int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}

このように定義するとエラーが発生します.

const int *&pi_ref = &ival;

int*をTとして定義し、上のコードは次のように等価です.

const T &pi_ref = &ival;

コンパイラは、この付与計算を処理します.

T temp;
temp = &ival;        
const T &pi_ref = temp;

ここでtempは「int*」タイプで、コンパイラが強制的に「const int*」を「int*」タイプに変えることはできません.元のプログラムは問題ありません.コンパイラがこのように処理したためです.「const int*」をTと定義します.

T temp;
temp = &ival;        
T const &pi_ref = temp;

これにより、以前のタイプが一致しなかった付与問題が解決されます.
4.配列
非constの変数は配列の次元数を指定するために使用できません.これはC言語を初めて学ぶときに犯すエラーの一つです.C++は,コンパイル時や実行時に配列の下付き文字を範囲チェックすることができないため,プログラムがコンパイルして実行できるとしてもエラーが発生する可能性がある.
ia[1,2]はC++では正当であるが、「1,2」はカンマ式であるためia[2]に等価である.
配列の定義

int ia[9] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };

ia,&ia[0]は等価であり,ia+1,&ia[1]は等価であり,ポインタにより配列の遍歴を実現できる.

#include "iostream"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	int ia[9] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
	int *pbegin = ia;
	int *pend = ia + 9;
	while ( pbegin != pend ) {
		cout << *pbegin << ' ';
		++ pbegin;
	}
	return 0;
}

5.vector容器
vectorを使用するには、ヘッダファイルvectorを追加する必要があります.vectorには、配列習慣とSTL習慣の2つの異なる形式があります.
配列の習慣
vector ivec(10);//int a[10]と類似
STL習慣
vector text;
6.typedef
ビルトインまたはユーザー定義のデータ型には、次のような補助記号を追加します.

typedef vector<int> vec_int;
vec_int vec1(10);// vector<int> vec1(10);  

typedefは、「複雑なテンプレート宣言の定義」の可読性を向上させ、「関数を指すポインタ」および「クラスのメンバー関数を指すポインタ」の可読性を向上させるために使用できます.

/* cstr   "const char *" */
/* const  cstr  ,cstr      */
/* cstr        const   */
typedef char *cstring;
extern const cstring cstr;

typedefを使用すると、pairタイプのオブジェクトを簡単に定義できます.

typedef pair<string, string> Authors;
Authors joyce("james", "joyce");
Authors musil("robert", "musil");
if (joyce.first == "james" && joyce.second == "joyce")
    /*   if  ,       */

7.volatile
volatile修飾子の使い方はconstと同様で、主な目的はコンパイラに提示することであり、このオブジェクトの値はコンパイラが検出していない場合に変更される可能性があるため、コンパイラはこれらのオブジェクトを参照するコードを独断的に最適化することができない.
参考書:『C++Primer』第3版