C++基础

const

荥阳ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!

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

内联函数声明时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(i);

(2)const_cast强制类型转换

.用于去除变量的const属性

const int& j=1;
int& k=const_cast(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++为了支持重载加上了函数参数的信息。


网页名称:C++基础
文章出自:http://ybzwz.com/article/iiojdp.html