C++基礎 學習筆記二:變數的宣告與初始化賦值
變數的宣告
? 所有變數必須在使用前進行宣告,變數可以在使用前進行宣告,不必在函式或程序的開始位置先宣告,
變數名規范
? 1. 名稱只能使用字母、數字、下劃線,
? 2. 名稱的第一個字符不能是數字,
? 3. 不能與C++關鍵字重名,
? 注:以下劃線開頭的變數名是系統專用的,盡量不要這樣命名,長度不要過長,最長盡量不要超過63,
變數宣告舉例
| 變數含義 | 宣告陳述句 | 變數含義 | 宣告陳述句 |
|---|---|---|---|
| 布爾 | bool var; | 字符/小整數 | char var; |
| 字符/有符號小整數(和char等價) | signed char var; | 無符號小整數 | unsigned char var; |
| 短整型 | short var; | 整型 | int var; |
| 長整型 | long var; | 超長整型 | long long var; |
| 單精度浮點數 | float var; | 雙精度浮點數 | double var; |
| 列舉型別 | enum <型別名>{<列舉常量表>}; | 共用體 | union Data {int i;float f;}data; |
| 結構體 | struct 結構體名 {成員串列}; | 類 | class 類名{成員串列}; |
| 整型陣列 | int a[10]; | 參考 | int &a=b; |
| 指向int的指標 | int* p; | ... | ... |
變數的初始化
1. 默認初始化
? 默認初始化是指定義變數時沒有指定初值時進行的初始化操作,
內置型別變數
? 若變數定義在陳述句塊(即{})外面,那么變數會被默認初始化為0或等同于0的值,
? 若變數定義在陳述句塊里面,變數的值是不確定的,
? 為什么不初始化變數呢?給自己挖坑嗎?
型別別變數
? 無論定義于何處都會執行默認建構式,如果默認建構式中沒有初始化變數,那么變數的值是不確定的,如果不 存在建構式,編譯器會根據需要創建空默認建構式,
2. 值初始化
? 值初始化是指用了初始化器但沒有提供初始值的情況,變數會被默認初始化為0或等同于0的值,
3. 直接初始化
? 直接初始化就是指使用了初始化器并且提供了初值的情況,
? 對于類來說,直接初始化會呼叫與實參最佳匹配的建構式,
? 例如:int a(1); string str("hello"); Test a(1,2,3);
4. 拷貝初始化
? 拷貝初始化就是用等號對變數進行賦值的方法,即將右值拷貝給左值,
內置型別變數
? 對于內置型別變數來說,直接初始化與拷貝初始化差別幾乎可以忽略不計,
型別別變數
? 對于型別別變數來說,直接初始化會呼叫與實參最佳匹配的建構式,但是拷貝初始化呼叫類的拷貝建構式,
? *注:對型別別變數進行初始化時,如果類的建構式采用了explicit修飾并且需要隱式型別轉換,此時只能通過 直接初始化而不能通過拷貝初始化,
? 例如:
#include<iostream>
using namespace std;
class Test
{
private:
string str;
public:
explicit Test(int arg): str("number")
{
}
Test(const char* arg): str(arg)
{
}
Test(const Test &arg): str(arg.str) //僅僅為了演示此處不寫復制str代碼了
{
}
void printStr()
{
cout << str << endl;
}
};
int main()
{
Test t1(97);
t1.printStr();
Test t2 = "asd";
t2.printStr();
//Test t3 = 988;//此處會報錯:invalid conversion from 'int' to 'const char*'
//t3.printStr();//此時只能通過直接初始化而不能通過拷貝初始化
Test t4 = t1;
t4.printStr();
return 0;
}
/* 運行結果為:
number
asd
number
--------------------------------
Process exited after 0.1125 seconds with return value 0
請按任意鍵繼續. . .
*/
5. 串列初始化
? 在可以使用直接初始化和拷貝初始化的地方都能用串列初始化,串列初始化對容器的初始化同其他方法更方便一
? 些,
對于容器
? 特別地,對于容器初始化時有() 和 {}兩種方法,
? 使用()
? 有一個引數時僅構造容器,兩個引數時,第一個引數構造容器,第二個初始化容器,
? 使用{}
? 如果引數序列的所有值均與容器型別相同,那么初始化時會將引數串列中的所有值放入容器中,容器的元素數 量和引數數量相同,
? 如果引數序列中的值與容器型別不同,那么會考慮將該值作為構造容器的引數;如果不能作為引數那么就會出 現編譯錯誤,
? 例如:
#include<iostream>
#include <vector>
using namespace std;
template <typename Type>
void testVector(const Type &arg)
{
cout << "大小:" << arg.size() << "個元素:";
for(int i = 0; i < arg.size(); i++)
{
cout << "\'" << arg[i] << "\'" << " ";
}
cout << endl;
}
void testArray(int* arg)
{
cout << "大小:" << 5 << "個元素:";
for(int i = 0; i < 5; i++)
{
cout << "\'" << arg[i] << "\'" << " ";
}
cout << endl;
}
int main()
{
int* arrayP1 = new int[5]();
int array[5] = {1,2,3,4,5};
vector<int> t1;
vector<int> t2(12);
vector<int> t3(12,3);
vector<int> t4{123};
vector<int> t5{12,3};
vector<string> t6;
//vector<string> t7("t7");//此陳述句錯誤,無法構造容器
vector<string> t8(8);
vector<string> t9(3,"t9");
vector<string> t10{"t10"};
vector<string> t11{3,"t11"};
testArray(arrayP1);
testArray(array);
testVector(t1);
testVector(t2);
testVector(t3);
testVector(t4);
testVector(t5);
testVector(t6);
//testVector(t7);
testVector(t8);
testVector(t9);
testVector(t10);
testVector(t11);
return 0;
}
/* 運行結果為:
大小:5個元素:'0' '0' '0' '0' '0'
大小:5個元素:'1' '2' '3' '4' '5'
大小:0個元素:
大小:12個元素:'0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0'
大小:12個元素:'3' '3' '3' '3' '3' '3' '3' '3' '3' '3' '3' '3'
大小:1個元素:'123'
大小:2個元素:'12' '3'
大小:0個元素:
大小:8個元素:'' '' '' '' '' '' '' ''
大小:3個元素:'t9' 't9' 't9'
大小:1個元素:'t10'
大小:3個元素:'t11' 't11' 't11'
--------------------------------
Process exited after 0.1704 seconds with return value 0
請按任意鍵繼續. . .
*/
6. 動態分配時的初始化
? 動態分配時不加以初始化時,內置資料型別的變數的值是不確定的,型別別變數將呼叫默認建構式進行初始化,
? 例如:
? int* a = new int();
? int* a = new int(123);
? vector<int> *t1 = new vector<int> {1,2,3,4};
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/52947.html
標籤:C++
上一篇:C++ 友元
下一篇:GPLT-天梯賽-題解目錄
