C++ 语法规则
C++ 中的布尔类型:布尔类型只占用一个bit ,但是如果连续定义多个布尔类型时,编译器可能会多个布尔类型定义在一起。true 编译器用1来表示。false 编译器用0来表示。
将一个其他类型的数据赋给布尔类型变量:C++编译器会将所有的非0的值转换为true(1),将0 转化为false(0)。
三木运算符 ? : :将一个三目运算符作为左值: (a>b?a:b) = 3 C语言不支持(三目运算符返回一个值),但在C++中支持(三目元算符返回变量)。 但是如果可能的返回值有一个是常量值,那么它就不能作为左值使用,如(a>b?1:b) = 3 非法。
引用:
C++中的引用:一个已经定义的变量的别名。 Type var , Type & name = var; 普通引用在声明时必须用其他的变量进行初始化。引用作为函数参数声明时不进行初始化。
const 修饰引用:const 使引用拥有只读属性,但是变量本身还是原来的属性。
当使用常量对const 引用进行初始化时,编译器会给常量分配空间,并将引用名命名为这段空间的别名。不能给普通引用赋值为常量,但是可以给常引用赋值为常量。此时常引用是只读的,除了在定义时,不能给它赋值。因此用一个常引用可以构成一个只读的变量,如 const int & a = 10 a是一个只读变量。
引用在C++ 的内部实现是一个常指针:type & name ßàtype* const name。因此引用拥有一个4字节的空间。
引用作为函数返回值:返回局部变量的引用时,引用不能作为左值,也不能用它初始化其他引用,但是如果引用时静态的或者全局变量的引用时就可以。
C++ 函数探幽:
- 内联函数:inline int function(…), 内联函数可以替代宏代码片段,在编译时将函数体直接替代函数被调用的地方,这样就减少了普通函数被调用时 的开销(压栈,跳转等),但是内联函数本质上还是一个函数,不同于宏代码片段。内联函数声明符inline 必须要和函数定义结合在一起,不能放在声明处,否则编译器忽略内联请求。 虽然内联函数省时省空间,但是编译器不一定准许函数的内联请求,当C++编译器不允许内联请求时会将内联函数当做普通函数处理。
- 默认参数: C++中可以在函数声明时为参数提供一个默认值,当函数调用时没有提供这个参数的值,编译器会自动用默认值代替。但是在函数定义时就不在指定默认参数值。默认参数有如下规则:
只有参数列表后面的部分参数才可以提供默认参数值,一但在一个函数调用中开始使用默认参数,那么这个参数后的所有参数都必须使用默认参数,因此从开始使用默认参数的使用开始都后面的参数都要提供默认参数,否则编译器将报错。总之,在函数声明时,如果一个参数开始提供默认参数,那么后面的所有参数都要提供默认参数;在调用函数时,如果开始省略参数,那么后面所有参数都使用默认参数。
- 函数占位参数:占位参数是在函数定义时只有类型声明,没有参数名声明的参数。一般情况下函数体内部无法使用占位参数。但是在调用时必须提供完整的参数个数。可以给占位参数提供默认参数。意义:为函数的后续版本的扩展埋下伏笔;兼容C语言中的不规范写法。
- 函数重载:简单来说函数重载就是用同一个函数名来定义不同的函数。那编译器是如何区分这些函数的呢?事实上,编译器是通过参数列表来区分重载了的函数。即重载函数拥有不同的参数列表。不同的参数列表包括参数个数不同、参数类型不同、参数顺序不同,即满足上述三个条件之一就能构成重载函数。函数重载在构造函数中是非常有用的。
当函数默认参数遇上函数重载会发生什么神奇的情况?假设这样的情况:程序当中定义两个重载函数,其中一个函数有一个默认参数,在主函数调用这个函数。能不能编译过呢?
经过编译器的验证,当函数默认参数遇上函数重载,编译时没有问题的,但是调用时会发生函数二义性的错误。因此在程序中不能同时使用函数默认参数和函数重载。
编译器调用重载函数的准则:
l 将所有的同名函数作为候选者
l 尝试寻找可行的候选函数
& 精确匹配实参
& 通过默认参数匹配实参
& 通过默认类型转换匹配实参
l 匹配失败
& 最终找到的可行候选函数不唯一,出现二义性,编译失败
& 无法匹配所有候选者,函数未定义,编译失败
注意:重载函数与返回值类型没有半毛钱关系。
当重载函数赋值给函数指针时发生:
1).根据重载规则挑选与函数指针参数列表一致的候选者
2).严格匹匹配候选者的函数类型与函数指针的函数类型
只有上述两个不步骤都成功时才能匹配成功,成功调用正确的函数。
C 与 C++ 互相调用:可以使用extern关键字强制让C++编译器对代码使用C的方式进行编译。如 extern “C” { content}
使用如下处理统一处理: __cplusplus 是C++编译器内置的标准宏定义,让C代码既可以通过C编译器的编译,也可以在C++ 编译器中以C方式编译。
#ifdef __cplusplus
extern “C”{
#endif
//函数声明或者函数定义
#ifdef __cplusplus
}
#endif
C++ 新关键字:
- new 和delete 动态内存分配和释放
变量申请 数组申请
type* pointer = new type; type* pointer = new type[N]; //申请内存
//……. //……. //使用内存
delete pointer delete[] pointer //释放内存
可以看出,new出来的内存空间不像普通变量那样有一个别名,只有一个地址赋给指针,访问都必须通过指针。
new 与 malloc 函数的区别:
l malloc 是C库提供的函数,new关键字是C++ 的一部分
l new 以具体类型为单位进行内存分配,malloc只能以字节为单位进行内存分配
l new 在申请单个类型变量时可以进行初始化,malloc 不具备初始化的特性
名称空间(namespace) :
C语言中所有的全局标识符共享同一个作用域:全局作用域,C++将全局作用域分成不同的部分,每个部分就是一命名空间,不同命名空间里的标识符可以同名而不会发生冲突,并且命名空间可以嵌套。值得注意的是全局作用域也叫默认命名空间。
命名空间的使用:
l 使用整个命名空间:using namespace name;
l 使用命名空间中的变量: using name ::variable
l 使用默认命名空间 :: variable
类的静态成员:静态成员函数+静态成员变量
类的静态成员变量:存储在全局数据区、不依赖于任何一个对象的类成员变量。
语法规则:type classname ::varname
类的静态成员函数:
语法规则 : 加上static 修饰符
v 在C++中可以定义静态成员变量和静态成员函数
v 静态成员属于整个类所有,不需要依赖任何对象
v 可以通过类名直接访问public静态成员
v 可以通过对象名访问public静态成员
v 静态成员函数可以直接访问静态成员变量
定义静态成员变量:
à在定义类时通过static 修饰成员成员变量可以将变量定义成静态成员变量
à静态成员变量不依赖任何对象,需要在类的定义外面单独分配空间:
type Classname::Varname;
静态成员函数的定义:
è 在定义时直接通过static 关键字修饰,其他的部分与普通的成员函数定义相同。
注意:C++ 类对象中的成员函数和成员变量是分开存储的
à成员变量:普通的成员变量存储在对象中,跟struct 变量有相同的内存分布和字节对齐方式;静态成员变量:存储在全局数据区;
à成员函数:存储于代码段中
静态成员函数和普通成员函数的区别:
l 静态成员函数不包含指向具体对象的指针 this, 但是普通成员函数包含有一个指向对象本身的指针:this 指针
继承:子类拥有父类的所有成员函数和成员变量、子类就是一种特殊的父类、子类对象可以当做父类对象使用、子类拥有父类没有的方法。
C++中的访问级别与继承:
public 继承:父类成员在子类中保持原有的访问级别
class child :pubic parent
private继承:父类成员在子类中是private访问级别
class child : parent ßàclass child :private parent
C++默认是私有继承:子类从父类继承得到的成员默认是私有的。
因为父类的private 成员在子类中不能被子类访问,因此出现一个新的访问级别:protected
类的protected 成员:
l Protected 成员可以在子类中被访问,但不能再外界被访问
l Protected 成员的访问权限介于public 和private 这两个级别之间
类成员访问级别设置的原则:
l 需要被外界访问的直接设置为public
l 只能在当前类中访问的成员设置为private
l 只能在当前类和子类中访问的成员设置为protected
注:private 成员在子类中仍然存在,但是却无法访问。
操作符重载:操作符重载的本质是通过函数重载实现。通过operator 关键字扩展操作符 :type operator character(…) {…}
C++ 语法规则的更多相关文章
- JavaScript:声明变量名的语法规则
一.语法规则 1.变量必须使用字母.下划线(_)或者美元符($)开始. 2.然后可以使用任意多个英文字母.数字.下划线(_)或者美元符($)组成. 3.不能使用JS关键词与保留字. 二.示例 var ...
- JSON 语法规则详解
JSON 的语法规则十分简单,无论用何种方法总结都只有数条而已,它参考了 C 语言家族的一些习惯,学习起来并不会感到陌生. 回顾JSON 的五点语法 1)- 数组(Array)用方括号("[ ...
- JavaScript的语法规则
JavaScript的语法规则 JavaScript区分大小写 JavaScript脚本程序须嵌入在HTML文件中 JavaScript脚本程序中不能包含HTML标记代码 每行写一条脚本语句 语句末尾 ...
- XML 语法规则
转摘自:http://www.w3school.com.cn/xml/xml_elements.asp XML 语法规则 XML 文档包含 XML 元素. XML 的语法规则很简单,且很有逻辑.这些规 ...
- PHPCMS标签:PC标签模板语法规则
模板语法规则1.变量表示{$name} 被解析成 <?=$name?>,表示显示变量$name的值,其中的“name”由英文字母.数字和下划线组成首字母必须是英文字母或者下划线. 2.常量 ...
- Jenkins 定时构建语法规则
1.Jenkins自由风格任务定时构建 2.语法规则 定时构建语法 * * * * * 第一个*表示分钟,取值0~59 第二个*表示小时,取值0~23 第三个*表示一个月的第几天,取值1~31 第四个 ...
- 良好的JavaScript编码风格(语法规则)
编码风格 1.概述 "编程风格"(programming style)指的是编写代码的样式规则.不同的程序员,往往有不同的编程风格. 有人说,编译器的规范叫做"语法规则& ...
- web(七)css的语法规则、注释
css的语法规则:特殊的css语法标识. !important:当使用多种方式设定标签样式时,设定样式渲染的应用优先权,声明在取值之后. .important { color: red !import ...
- 2018-01-15 Antlr4: 修改语法规则更接近普通BNF格式
经 @沈默 在上文Antlr4添加中文变量赋求值,括号,各种问题评论中指出, 语法规则描述依赖于Antlr4生成的语法分析器的默认分析方法, 比如运算符的左联系, 以及优先级处理等等. 于是将语法修改 ...
随机推荐
- SDN基础理解
本文转载自:http://blog.csdn.net/freezgw1985/article/details/16873677 个人觉得对很适合对SDN的入门级的概念性理解,先暂时copy一下,等研究 ...
- hdu 4472 Count(递推即dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4472 代码: #include <cstdio> #include <cstring ...
- iptables vpn
- C语言学习_一个简单程序的解释与C学习方法概括
简单计算器程序示例: # include <stdio.h> //1.头文件 //2.加法函数 int add(int a,int b)//3.函数定义方式 { //4.函数体 retur ...
- 帮助招聘程序员的自动考试网站:Codility
Automated tests of programming skills. Assessment of software developers. Recruitment software. Codi ...
- 遇到奇怪的C#/C/C++或者Java的bug可以去问问Coverity
Coverity7月16号在博客Ask The Bug Guys中说以后遇到奇怪的C#/C/C++或者Java的bug可以给TheBugGuys@coverity.com发邮件.然后这些问题就会到一些 ...
- wdlinux mysql innodb的安装
mysql innodb的安装 wget -c http://down.wdlinux.cn/in/mysql_innodb_ins.sh chmod 755 mysql_innodb_ins.sh ...
- [RxJS] What RxJS operators are
We have covered the basics of what is Observable.create, and other creation functions. Now lets fina ...
- windows server 许可port或执行技巧
底:于windows serverserver于,部署应用程序,例如http当协议应用,当外网通http协议来访问网页,我们需要得到server入境许可,在访问者的浏览器网页内容足够的天赋正常显示,除 ...
- 关于C++的疑问剖析
1)众所周知,抽象类是不存在对象的,只提供接口而不提供实现.但是抽象类能不能作为一个类指针,指向其子类的对象呢? class Interface { public: ; }; class Implem ...