本章主要内容:

  • 1)bool类型
  • 2)三目运算符
  • 3)引用

1.布尔型bool

在C++中,bool类型只有true(非0)和flase(0)两个值,且bool类型只占用了一个字节.

例如:

#include <stdio.h>

int main()
{
bool b=false;
printf("b=%d\n",b); b=-; //由于-5是个非0值,所以b=1
int a=b;
printf("a=%d,b=%d\n",a,b);
}

输出结果:

b=
a=,b=

2.C++三目运算符

C++对三目运算符进行了升级,升级后的三目运算符可以放在左值使用,例如:

int a=,b=;

(a>b?a:b)=;     //由于a不大于b,所以返回值为b变量,即等价于: b=100

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

输出结果:

a=,b=

注意: 放在左值使用时,三目运算符可能返回的值都必须是变量,若有常量,则编译会报错.

3.C++的&引用

3.1 引用在定义时,必须初始化,且类型必须一致,初始化的值必须是变量,而非常量

只用const引用才允许初始化的值是常量(在3.3小节会讲解),例如:

int a=;

int &b=a;        //引用b是a的别名,也就是a和b都是同一个变量,操作b就等于操作a

//int &b=1;      //出错,因为只有const引用才允许初始化的值是常量 

3.2 &引用的本质

引用的本质就是一个指针常量(从反汇编看出),因此引用所占用的空间大小与指针相同,比如:

int & a;    <---等价于-->  int *const a;

引用比指针更适合做为函数的参数,具有更好的可读性,例如:

#include <stdio.h>

/*交换a和b的值*/
void swap(int& a,int& b)
{
int tmp; tmp=a;
a=b;
b=tmp;
} int main()
{
int a=,b=; swap(a,b);
printf("a=%d b=%d\n",a,b);
return ;
}

输出结果:

a=  b=

3.3 const &引用

const &修饰为只读变量

  • 使用常量对const引用初始化时,编译器会自动分配一段空间,
  • 使用变量对const引用初始化时,编译器不会分配空间,而是将const引用和变量捆绑在一起。

例如:

#include <stdio.h>
int main()
{
int c=; const int& a = ; //定义const引用a,指定a的初始化是个常量1
const int& b = c; //定义const引用b,指定b的初始化是个变量c int *p =(int *)&a; //b=2; //错误,不能直接修改const引用的内容,因为b是个只读变量 *p=; //改变const引用a的内容
printf("a=%d,b=%d,c=%d\n",a,b,c); p= (int *)&b;
*p=; //改变const引用b的内容
printf("a=%d,b=%d,c=%d\n",a,b,c);
return ;
}

输出结果:

a=,b=,c=
a=,b=,c=

从结果可以看出:

  • const引用a初始化的是一个常量1,但却能被修改成功,说明a有自己的一段存储空间
  • 而const引用b被指针修改后,变量c也跟着改变,说明const引用b和变量c的存储空间是一起的
  • 所以,在C++中,const修饰的是常量,而const & 修饰的是只读变量(可以通过指针修改值)

注意:在初始化时,比如变量c和const引用b定义的类型不同,则将会生成一个新的存储空间给b,并赋值.

例如:

   char c= 'c';  

   const int &b = c;

   c='b';      //修改c的值,对b没有任何影响

   printf("b='%c'  c='%c'\n",b,c);

输出结果:

b='c'   c='b'

3.4 引用数组

C++不支持引用数组,因为在C中,数组存放的是连续相邻的一串数据,所以C++也要兼容该特性。

而引用恰好破坏了该特性.

以一个错误为例:

#include <stdio.h>

int a = ; //全局变量

int main()
{
int b = ; //局部变量
int* pc = new int(); //栈地址处的变量 int& array[] = {a, b, *pc}; //编译出错 delete pc;
return ;
}

从上面可以看到a, b, *pc这3个变量的定义位置都不同,分配的存储空间地址也是不连续的,然后又使:

  • array[0]的地址=a地址
  • array[1]的地址=b地址
  • array[2]的地址=pc地址

所以导致数组存放的数据不是连续相邻的,编译出错

下章接着来学习: 3.C++内联函数,默认参数,占位参数

2.C++中的bool类型,三目运算符,引用的更多相关文章

  1. object-c中的BOOL类型

    object-c中的布尔类型比C语言中的bool类型早了10年,它具有YES和NO两种值.在object-c中的布尔类型BOOL实际上是一种带符号的字符类型(signed char),它使用的空间是1 ...

  2. c语言中自定义bool类型模板

    首先,c语言中没有bool类型,只有c++中有,所以需要自定义,即c中表示bool类型的方法: 1.模板1 typedef int bool; #define false 0 #define true ...

  3. C++中的布尔类型和引用

    1,C++ 中的布尔类型: 1,C++ 在 C 语言的基础类型系统之上增加了 bool: 1,C 语言中,没有 bool 类型存在,往往都是用整型代替 bool 类型,常用 0 表示假,用 1 表示真 ...

  4. C++中的bool类型

    1.C++中的布尔类型 (1)C++在C语言的基础类型系统之上增加了bool: 1)C语言中,没有bool类型存在,往往都是用整型代替bool类型,常用0表示假,1表示真: 2)bool本来就有这样的 ...

  5. Python中的bool类型

    Python 布尔类型 bool python 中布尔值使用常量True 和 False来表示:注意大小写 比较运算符< > == 等返回的类型就是bool类型:布尔类型通常在 if 和 ...

  6. C#中判断bool 类型 代码的最短写法

    看到一个关于写最短代码的,  是一个bool类型判断的:    public bool IsNull(object val) { if (val == null) { return true; } e ...

  7. JavaScript中关于bool类型判断的一些总结。

    我从书上看到了一些关于   int类型 0 转换成boolean值得时候会把0转换成 false ,string 类型 的  "" 也会装换成false; 所以我就想,我能不能用一 ...

  8. Objective-C 中的 BOOL

    之前开发了一个针对单个数据模型,自动建表.增删改查等操作的 ORM 库,后边在 iPhone 5c 上使用时,出现了 crash 的情况. 该项目在 Github 开源,项目地址为SXJDatabas ...

  9. bool和BOOL类型知识集合

    知识点一.C语言中有bool类型吗? 转自http://blog.csdn.net/liuqiqi677/article/details/6703615 之前一直都没有注意到,最近在用C语言写DSP算 ...

随机推荐

  1. v$lockv和$locked_object的区别

    v$lockv和$locked_object的区别 url: http://blog.sina.com.cn/s/blog_62defbef0101pgvo.html 2013-12-24 v1.0 ...

  2. apache、nginx、tomcat配置方法

    https://www.cnblogs.com/chenmh/p/5121830.html

  3. 可在广域网部署运行的即时通讯系统 -- GGTalk总览(附源码下载)

      (最新版本:V6.2,2019.01.03 .Xamarin移动端版本已经推出,包括 Android 和 iOS) GGTalk开源即时通讯系统(简称GG)是QQ的高仿版,同时支持局域网和广域网, ...

  4. SDWebImage之SDWebImageManager

    SDWebImageManager是SDWebImage的核心类.它拥有一个SDWebImageCache和一个SDWebImageDownloader属性,分别用于图片的缓存和下载处理.虽然是核心类 ...

  5. MySQL优化--NOT EXISTS和LEFT JOIN方式差异

    在MySQL中,我们可以将NOT EXISTS语句转换为LEFT JOIN语句来进行优化,哪为什么会有性能提升呢? 使用NOT EXISTS方式SQL为: ) FROM t_monitor m WHE ...

  6. 使用tinymce富文本

    1.tinymce入门参考 https://www.tiny.cloud/docs/general-configuration-guide/basic-setup/ 2.tinymce安装选项 htt ...

  7. 如何正确的使用Ubuntu以及安装常用的渗透工具集.

    文章来源i春秋 入坑Ubuntu半年多了  记得一开始学的时候基本一星期重装三四次=-= 尴尬了 觉得自己差不多可以的时候 就吧Windows10干掉了 c盘装Ubuntu 专心学习.   这里主要来 ...

  8. jQuery应用实例2:表格隔行换色

    这里是用JS实现的:http://www.cnblogs.com/xuyiqing/p/8376312.html 接下来利用上一篇提到的选择器利用jQuery实现: 发现原来多行代码这里只需要两行: ...

  9. LDA-线性判别分析(三)推广到 Multi-classes 情形

    本来是要调研 Latent Dirichlet Allocation 的那个 LDA 的, 没想到查到很多关于 Linear Discriminant Analysis 这个 LDA 的资料.初步看了 ...

  10. SpringBoot之oauth2.0学习之服务端配置快速上手

    现在第三方登录的例子数见不鲜.其实在这种示例当中,oauth2.0是使用比较多的一种授权登录的标准.oauth2.0也是从oauth1.0升级过来的.那么关于oauth2.0相关的概念及其原理,大家可 ...