第二课-C++中的引用

来源:互联网 发布:电脑发短信软件 编辑:程序博客网 时间:2024/04/27 02:10

C到C++的升级


在C语言标准(C89)没有定义布尔类型,所以C语言判断真假时以0为假,非0为真。
在C99标准中对此有所改进。C99提供了_Bool 型,所以布尔类型可以声明为 _Bool flag.

 _Bool依然仍是整数类型,但与一般整型不同的是,_Bool变量只能赋值为0或1,非0的值都会被存储为1.

 另外,C99还提供了一个头文件 定义了bool代表_Bool,true代表1,false代表0.只要导入 stdbool.h ,就能非常方便的操作布尔类型了。


C++中的布尔类型

(1)C++在C语言的基本类型系统之上增加了bool;

(2)C++中的bool可取的值只有true和false;

(3)理论上bool只占用一个字节,如果多个bool变量定义在一起,可能会各占一个字节,这取决于编译器的实现。

Tip:true代表真值,编译器内部用1来表示;false代表非真值,编译器内部用0来表示。

下面程序将会输出什么?

int  main()

{

int a;

bool b = true;

printf("b = %d,sizeof(b) = %d\n",b,sizeof(b));     //1,1

b=3;

a=b;

printf("a = %d,b = %d\n",a,b); //1,1

b=-5;

a=b;

printf("a = %d,b = %d\n",a,b); //1,1

a=10;

b=a;

printf("a = %d,b = %d\n",a,b); //10,1

b=0;

printf("b = %d",b); //0

return 0;

}

(4)bool类型只有true(非0)和false(0)两个值,C++编译器会在赋值时将非0值转换为true,0值转换为false;


布尔类型参与数学运算

结果是0,1,1


三目运算符的升级

下面代码正确吗?如果正确输出什么

int main()

{

int a=1;

int b=2;

(a<b?a:b)=3;              //C语言中三目运算符返回的是值,不能这么赋值!C++中可以C++中返回的是变量本身,a=3,b=2。 

printf("a=%d,b=%d\n",a,b);

return 0; 

}

(1)C++中的三目运算符返回的是变量值,不能作为左值使用;

(2)C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方;注意:三目运算符可能返回的值中如果有一个常量值,则不能作为左值使用。



C++中的引用

变量名回顾:变量名是一段实际连续存储空间的别名;程序中通过变量名来申请并命名存储空间;通过变量的名字可以使用存储空间。

思考:对于一段连续的存储空间只能有一个别名吗?

在C++中增加了引用的概念

(1)引用可以看作一个已定义变量的别名;

(2)引用的语法:Type& name = var;

int main()

{

int a = 4;

int& b= a;


b=5;

printf("%d\n",a);        //5

printf("%d\n",b); //5

printf("%08X\n",&a); 和b一样

printf("%08X\n",&b);

}

a和b指代的是同一段内存空间。

Tips普通的引用在声明时必须用其它的变量初始化;

(3)引用的意义:引用作为其他变量的别名而存在,因此在一些场合可以代替指针;引用相对于指针来说有更好的可读性和可维护性。

swap函数实现对比



Tips:引用作为函数参数声明时不进行初始化。

引用变量是直接对实参进行操作。





const引用

(1)在C++中可以声明const引用

(2)const Type& name=var;

(3)const引用让变量拥有只读属性;

int main()

{

int a = 4;

const int& b= a;

int* p=(int*)&b;

*p=5;

printf("%d\n",a);        //5

printf("%d\n",b); //5

}

(4)当使用常量对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名,这时候不是常量,是一个只读变量只有常引用才能用常量初始化,其他得用变量初始化。


打印出的值为5.

可以对常引用 进行初始化。

Tips:使用常量对const引用初始化后将生成一个只读变量。这个时候C语言中const是一样的。



引用有自己的存储空间吗?

struct TRet

{

int& a;

int& b;

}

int main()

{

printf("sizeof(TREF) = %d\n",sizeof(TRef));          //8

return 0;

}

(1)引用在C++中的内部实现是一个常指针:Type& name   <-->Type* const name;

(2)C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同;

(3)从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏。






当函数的返回值为引用时

(1)若返回栈变量:不能成为其他引用的初始值;不能作为左值使用。

(2)若返回静态变量或全局变量:可以成为其他引用的初始值;既可作为左值使用也可作为右值使用。




C++对三目运算符做了什么?

(1)当三目运算符的可能返回值都是变量时,返回的是变量的引用;

(2)当三目运算符的可能返回中有常量时,返回的是值。

int a=1;

int b=2;

(a<b?a:b) =3 //正确,返回a,或b的引用,可以作为右值使用。

(a<b?1:b) =3 //错误,可能返回中有常量,返回的是值,不能作为右值使用。




总结

(1)bool类型是C++新增的类型基础,其值只能是true和false;

(2)C++中的引用可以看做变量的别名来使用;

(3)C++中的常引用可以使得一个变量拥有只读属性;

(4)C++中的常引用可以用常量初始化得到一个只读变量;

(5)C++中引用的本质是一个指针常量。


0 0