C++學習札記20140310

引用必須被初始化,一旦初始化完成引用將和它的初始值對象一直綁定在一起,無法令引用重新綁定到另外一個對象。

引用並非對象,只是對存在的的對象所起的另外一個名字

引用本身不是一個對象,所以不能定義指向引用的指針(指針指向的必須是對象)

指針是對象,所以存在對指針的引用

const指針必須初始化,也就是常量指針必須初始化

引用只能綁定在對象上,而不能與字面值綁定在一起

試圖拷貝或以其它方式訪問無效指針的值都將引發錯誤,編譯器並不負責檢查此類錯誤,這一點和試圖使用未經初始化的變量是一樣的。訪問無效指針的後果無法預計!!!,因此程序員必須清楚任意給定的指針是否有效!!!!

數組的元素應爲對象,因此不存在引用的數組

又因爲數組本身就是對象,所以允許定義數組的指針及數組的引用

int i = 42;
	int &ip = i;
	int *p;
	int *&r = p;
	r = &i;
	cout << *r << endl;
	cout << *p << endl;
	cout << ip << endl;
輸出都是42,仔細理解

string對象會自動忽略開頭的空白

getline函數會保留輸入字符串中的空白符,它的結束標誌是換行符(換行符也被讀入了),getline(cin, s),然後把讀入的string對象s存取,但是不存換行符

比較以下兩個程序

//按個數輸出單詞,每個單詞輸出後就換行,讀取位置數量的string對象
int main()
{
	string word;
	while(cin >> word)
	{
		cout << word << endl;
	}
	return 0;
}
//按行輸出,使用getline讀取一整行
int main(void)
{
	string word;
	while(getline(cin, word))	//每次讀取一整行,直到到達文件尾或換行符才結束
	{
		cout << word << endl; 
	}
	return 0;
}

默認初始化的一些注意的問題

默認初始化的默認值到底是什麼由變量類型決定。同時定義變量的位置也會對此有影響!

如果是內置類型的變量未被顯示初始化,它的值由定義的位置決定,定義於任何函數體之外的變量被初始化爲0.

如果定義在函數體內部的內置類型沒有初始化,它的值是未定義的,不能拷貝或訪問此類值

//訪問數組的不同辦法
#include <iostream>
#include <string>
#include <vector>
#include <cctype>

using namespace std;

int main()
{
	int iB[10];
	int iA[10];
	vector<int> iVec;
	for (int i = 0; i < 10; ++i)
	{
		iA[i] = i;
		cout << iA[i] << ' ';
	}
	cout << endl;
	for (int j = 0; j < 10; ++j)
	{
		iB[j] =iA[j];
		cout << iB[j] << ' ';
	}
	cout << endl;
	for (int j = 0; j < 10; ++j)
	{
		iVec.push_back(iA[j]);
	}
	for (vector<int>::size_type i = 0; i != iVec.size(); ++i)
	{
		cout << iVec[i] << ' ';
	}
	cout << endl;
	//不需要改變迭代器指向的內容,所以聲明成常量迭代器
	for (vector<int>::const_iterator iter = iVec.cbegin(); iter != iVec.cend(); ++iter)
	{
		cout << *iter << ' ';
	}
	cout << endl;
	return 0;
}

使用數組的時候編譯器一般會把它轉換成指針。

取地址符可以用於任何對象

數組還有一個特性:在很多用到數組名字的地方,編譯器都會自動地將其替換爲一個指向數組首元素的指針

string nums[] = {"one", "two", "three"};

string *sp = nums; //等於 *sp = &nums[0]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章