第二课-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++中引用的本质是一个指针常量。
- 第二课-C++中的引用
- c语言中的引用
- 【C++】:C++中的引用
- C++第二课 引用实例
- 第二周项目1 C/C++语言中的函数参数传递的三种方式--引用作形参
- 深入探讨C 中的引用
- 深入探讨C 中的引用
- C++/CLI中的引用类型
- 深入探讨C 中的引用
- C++中的引用
- [C++]C++中的引用(转)
- 【引用】C中的类型转换
- C语言中的引用调用
- 深入探讨c++中的引用
- C/C++中的指针、引用和JAVA中的引用
- 《C++Primer》笔记 第二章2.3 指针和引用
- 第二课 C语言
- C语言第二课
- Proteus仿真AT89C52——IO
- 欢迎使用CSDN-markdown编辑器
- 简述C++中STL标准模板库
- C++之析构函数与虚函数
- 坚持#第145天~想好了每天的规律,学习了一部分该学的内容
- 第二课-C++中的引用
- Hexo 搭建个人博客网站
- JAVA程序员面试总结,高手整整理加强版 出自“CSDN(www.csdn.net)”
- [IOS APP]四大名著儿童版-有声故事
- Leetcode: 310.Minimum Height Trees
- 深入浅出学Spring Data JPA
- A + B 问题
- C++知识体系
- 招人面试