1、bool類型
bool有兩個內建的常量,true和false
三個名字都是關鍵字。
bool類型只有兩個值,一個true(1),一個false(0)。
給bool類型賦值時,只能賦true,false和數值(非0自動轉換爲1,負數也轉爲1)。
int main (int argc,char *argv[])
{
bool myBool = -123;
bool myBool1 = false;
bool myBool2 = true;
cout << "myBool=" << myBool <<endl;
cout << "myBool1=" << myBool1 <<endl;
cout << "myBool2=" << myBool2 <<endl;
cout << "false=" << false <<endl;
cout << "true=" << true << endl;
return 0;
}
運行結果:
2、三目運算符
a、C語言中三目運算表達式返回值爲數據值,爲右值,不能賦值
b、c++中三目運算表達式返回值爲變量本身,爲左值。可賦值
3、const修飾變量
a、C語言中:
1、const修飾全局變量num 變量名只讀 內存空間在文字常量區(只讀)、不能通過num的地址 修改空間內容
2、const修飾局部變量data 變量名只讀 內存空間棧區(可讀可寫),可以通過data地址 間接的修改空間內容
b、c++語言中的中const
1、const int data = 10;//data先放入符號表
2、如果對data取地址 系統纔會給data開闢空間
3、const int a = b;//b是變量名 系統直接給a開闢空間 而不放入符號表
4、cosnt 修飾自定義數據 系統爲自定義數據開闢空間
c、const和#define(宏)
1、const有類型的,可進行編譯器類型安全檢查。#define無類型。
宏不佔內存空間,但是宏展開以後的數據是要佔內存的。
#define MAX 10
cout << "宏 " << sizeof(MAX) << endl;//求得是 10 的大小
2、const有作用域,#define不重視作用域,默認定義處到文件結尾。
3、宏不能作爲命名空間的成員,但const可以。
#include <iostream>
using namespace std;
namespace A {
#define M 10
}
int main (int argc,char *argv[])
{
cout << A::M << endl;//err:宏是大家的,不是A自己的,將A::去掉就可以了
return 0;
}
4、引用:給已有變量取個別名
1、語法:
1、&和別名 結合 表示引用
2、給某個變量取別名 就定義某個變量
3、從上往下替換
int num = 10;
int &a = num;//此處 &不是取地址 而是標明 a是引用變量(a 是 num的別名)
注意:
a、引用必須初始化。(娃娃親)
b、引用一旦初始化,就不能再次修改別名。(一生一世)
案例(幫助消化):
int num = 10;
int &a = num;//a就是num的別名 a==num
cout<<"num = "<<num<<endl;//10
//對a賦值 == 對num賦值
a=100;
cout<<"num = "<<num<<endl;//100
//a是num的別名 所以num和a具有相同的地址空間
cout<<"a 的地址:"<<&a<<endl;
cout<<"num 的地址:"<<&num<<endl;
結果:
2、引用給數組取別名
方法1:
int main (int argc,char *argv[])
{
int arr[4]={1,2,3,5};
int (&a)[4]=arr;//整體代換
int i = 0;
for (i=0;i<4;i++)
{
cout << a[i] <<" ";
cout << arr[i] <<" ";
}
return 0;
}
方法2:配合typedef
int main (int argc,char *argv[])
{
int arr[4]={1,2,3,5};
typedef int TYPE_ARR[4];//用typedef給數組取個別名
TYPE_ARR &myArr = arr;//數組的別名
int i = 0;
for (i=0;i<4;i++)
{
cout << myArr[i] <<" ";
cout << arr[i] <<" ";
}
return 0;
}
3、引用作爲函數的參數(作用跟指針相似)
void my_swap1(int a,int b)
{
int tmp = a;
a = b;
b=tmp;
}
void my_swap2(int *a,int *b)//a=&data1,b =data2;
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void my_swap3(int &a, int &b)//a=data1,b=data2
{
int tmp = a;
a = b;
b= tmp;
}
void test04()
{
int data1 = 10,data2=20;
cout<<"data1 = "<<data1<<", data2 = "<<data2<<endl;
//my_swap1(data1,data2);//交換失敗
//my_swap2(&data1,&data2);//交換成功
my_swap3(data1,data2);//交換成功(推薦)
cout<<"data1 = "<<data1<<", data2 = "<<data2<<endl;
}
4、引用作爲函數的返回值
函數返回啥變量,引用就是該變量的別名
注意:不要返回局部變量哦,可以來個靜態局部變量
5、 引用的本質:
引用的本質在c++內部實現是一個指針常量. Type& ref = val; // Type* const ref = &val;
c++編譯器在編譯過程中使用常指針作爲引用的內部實現,因此引用所佔用的空間大小與指針相同,只是這個過程是編譯器內部實現,用戶不可見
6、常引用
typedef struct
{
int num;
char name[32];
}STU;
void myPrintSTU1(STU tmp)//普通結構體變量作爲形參 開銷太大
{
cout<<sizeof(tmp)<<endl;
cout<<"學號:"<<tmp.num<<", 姓名:"<<tmp.name<<endl;
}
void myPrintSTU2(const STU &tmp)//STU &tmp=lucy;tmp是lucy的別名 tmp沒有開闢獨立空間
{
//tmp.num = 2000;//err 因爲tmp爲常引用
cout<<"學號:"<<tmp.num<<", 姓名:"<<tmp.name<<endl;
}
void test08()
{
STU lucy = {100,"lucy"};
//需求:定義一個函數 遍歷lucy成員(讀操作)
myPrintSTU2(lucy);
}