您好,登录后才能下订单哦!
const
7.C++编译器对const常量的处理
(1)当碰见常量声明时在符号表中放入常量
(2)编译过程中若发现使用常量则直接以符号表中的值替换
(3)编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间
8.C语言中的const变量:是只读变量,有自己的存储空间
9.C++中的const,在定义的时候放入符号表中,在使用的时候直接从符号表中取出,可以通过取地址改变内存的值,但是在使用的时候不会用内存中的值
10.当const常量为全局,并且需要在其他文件中使用,当使用&操作符取const常量的地址
11.C++所有的变量和函数都必须有类型
12.在C语言中int f()表示返回值为int ,接受任意参数的函数
int f(void);表示返回值为int 的无参函数
在C++中
int f();和int f(void)具有相同的意义,都表示返回值为int的无参函数
bool
13.C++中的布尔类型
(1)C++在C语言的基本类型系统之上增加了bool
(2)C++的bool可取的值只有true和false
(3)理论上bool只占用一个字节
如果多个bool变量定义在一起,可能会个占一个bit,这取决于编译器的实现
Tip:
true代表真值,编译器内部用1来表示
false代表非真值,编译器内部用0来表示
14.bool类型只有true和false两个值
C++编译器会在赋值时将非0值转换为true,0值转换为false。
15.bool类型也参加数学运算
16.三目运算符的升级:C语言中返回的是变量的值,C++中返回的是变量的本身。三目运算符可能的返回值中如果有一个是常量值,则不能作为左值使用.
引用
17.C++中的引用:引用可以看作一个已定义变量的别名
引用的语法:Type& name=var;(普通引用在声明时必须用其他的变量进行初始化)
18.引用的意义:
引用作为其他变量的别名而存在,因此在一些场合可以代替指针
引用相对于指针来说具有更好的可读性和实用性
19.引用作为函数参数声明时不进行初始化
20.引用是正宗的传址,指针实质上是传值
21.const引用
(1)在C++中可以声明const引用
(2)const Type& name=var
(3)const引用让变量拥有只读属相
22.当使用常量对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名(使用常量对const引用初始化后将生成一个只读变量)
23.引用在C++中的内部实现是一个常指针
Type&name=Type* const name
C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同
从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间,只是C++为了实用性而做出的细节隐藏。
24. 当函数返回值是引用时:
若返回栈变量:不能成为其他引用的初始值,不能作为左值使用
若返回静态变量或全局变量:可以成为其他引用的初始值,即可作为右值使用,也可作为左值使用
内联函数
25.C++中推荐使用内联函数替代宏代码片段
C++中使用inline关键字声明内联函数
inline int func(int a,int b) { return a<b? a:b; }
内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求
26.
(1)C++编译器可以将一个函数进行内联编译
(2)被C++编译器内联编译的函数叫做内联函数
(3)内联函数在最终生成的代码中是没有定义的
(4)C++编译器直接将函数体插入函数调用的地方
(5)内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)
C++编译器不一定准许函数的内联请求
(6)内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型等)
(7)内联函数是对编译器的一种请求,因此编译器可能拒绝这种请求
(8)内联函数由编译器处理,直接将编译后的函数体插入调用的地方,宏代码片段由预处理器处理,进行简单的文本替换,没有任何编译过程。
27.现代C++编译器能够进行编译优化,因此一些函数即使没有inline声明,也可能被编译器内联编译
28.另外,一些现代C++编译器提供了拓展语法,能够对函数进行强制内联
如:
_attribute_((always_inline))//属性
29.C++内联编译的限制:
(1)不能存在任何形式的循环语句
(2)不能存在过多的条件判断语句
(3)函数体不能过于庞大
(4)不能对函数进行取地址操作
(5)函数内联声明必须在调用语句之前
编译器对于内联函数的限制并不是绝对的,内联函数相对于普通函数的优势只是省去了函数调用时压栈,跳转和返回的开销,因此,当函数体的执行开销远大于压栈,跳转和返回所用的开销时,那么内联将无意义。
30.C++中的符号表编译器自己所用的东西,不会进入最终的程序的。
31.C++中可以在函数声明时为参数提供一个默认值,当函数调用时没有指定这个参数的值,编译器会自动用默认值代替
32.函数默认参数的规则:
(1)只有参数列表后面部分的参数才可以提供默认参数值
一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值
33.在C++中可以为函数提供占位参数
(1)占位参数只有参数类型声明,而没有参数名声明
(2)一般情况下,在函数体内部无法使用占位参数
34.可以将占位参数与默认参数结合起来使用
(1)为以后程序的拓展留下线索
(2)兼容C语言中可能出现的不规范写法
35.
重载
定义:同一个标识符在不同的上下文有不同的意义
36.函数重载:
(1)用同一个函数名定义不同(参数不同)的函数
(2)当函数名和不同的参数搭配时函数的含义不同
37.函数重载至少满足下面的一个条件:
(1)参数个数不同
(2)参数类型不同
(3)参数顺序不同
38.当函数的默认参数和函数重载在一起时:引用会报错(存在二议性,调用失败)
39.编译器调用重载函数的准则:
(1)将所有同名函数作为候选者
(2)尝试寻找可行的候选函数
.精确匹配实参
.通过默认参数能够匹配实参
.通过默认类型转换匹配实参
(3)匹配失败
.最终寻找到的可行候选函数不唯一,则出现二义性,编译失败
.无法匹配所有候选者,函数未定义,编译失败
40.函数重载的注意事项:
(1)重载函数在本质上是相互独立的不同函数
(2)重载函数的函数类型是不同的
(3)函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的
41.
函数重载与函数指针
(1)当使用重载函数名对函数指针进行赋值时
.根据重载规则挑选与函数指针参数列表一致的候选者
.严格匹配候选者的函数类型与函数指针的函数类型
42.利用extern关键字强制让C++编译器对代码进行C方式编译
43.C++中的动态内存分配:
.C++中通过new关键字进行动态内存申请
.C++中的动态内存申请是基于类型进行的
.delete关键字用于内存释放
44.new关键字与malloc函数的区别:
(1)new关键字是C++的一部分,malloc是由C库提供的函数
(2)new以具体类型为单位进行内存分配,malloc只能以字节为单位进行内存分配
(3)new在申请单个类型变量时可进行初始化,malloc不具备内存初始化的特性
int* pi=new int(1);//将指针指向的变量初始化 float* pf=new float(2.0);
45.在C语言中只有一个全局作用域:
C语言中所有的全局标识符共享一个作用域,标识符之间可能发生冲突
46.C++提出了命名空间的概念
(1)命名空间将全局作用域分成不同的部分
(2)不同命名空间中的标识符可以同名而不会发生冲突
(3)命名空间可以相互嵌套
(4)全局作用域也叫默认命名空间
47.C++命名空间关键字为(namespace)
48.C++命名空间的使用:
(1)使用整个命名空间:using namespace name;
(2)使用命名空间中的变量:using nam::variable
(3)使用默认命名空间中的变量:::variable
默认情况下可以直接使用默认命名空间中的所有标识符。
49.C++中含有四个关键字用于强制类型转换:
(1)static_cast强制类型转换
.用于基本类型间的转换,但不能用于基本类型指针间的转换
.用于有继承关系类对象之间的转换和类指针之间的转换
------static_cast是编译期进行转换的,无法再运行时检测类型,所以类类型之间的转换可能存在风险
int i=0; char c='c'; c=static_cast<char>(i);
(2)const_cast强制类型转换
.用于去除变量的const属性
const int& j=1; int& k=const_cast<int&>(j);
(3)reinterpret_cast强制类型转换
.用于指针类型间的强制转换
.用于整数和指针类型间的强制转换
reinterpret_cast直接从二进制进行复制,是一种极其不安全的转换
(4)dynamic_cast强制类型转换
.主要用于类型层次间的转换,还可以用于类之间的交叉转换
.dynamic_cast具有类型检查的功能,比static_cast更安全
50.只有字面量初始化的const常量才会进入符号表
51.被volatile修饰的const常量不会进入符号表
52.const引用的类型与初始化变量的类型
53.指针与引用的区别:
(1)指针是一个变量,其值为一个内存地址,通过指针可以访问对应内存地址中的值
(2)引用只是一个变量的新名字,所以对引用的操作(赋值,取地址等)都会传递到其引用的变量上
(3)指针可以被const修饰成为常量或者只读变量
(4)const引用使其引用的变量具有只读属性
(5)指针就是变量,不需要初始化,也可以指向不同的地址
(6)引用天生就必须在定义时初始化,之后无法在引用其他变量
54.C++编译器对字面量的处理方式:
(1)整数型字面量的默认类型为int,占用4个字节
(2)浮点型字面量的默认类型为double,占用8个字节
(3)字符型字面量的默认类型为char,占用1个字节
(4)字符串型字面量的默认类型为const char*,占用4个字节
55.当使用字面量对变量进行初始化或赋值时:
(1)无溢出产生:编译器对字面量进行默认类型转换
(2)产生溢出:编译器会做截断操作,并产生警告
56.C编译器编译后不会再函数名中加上参数的信息,而C++为了支持重载加上了函数参数的信息。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。