- 1.命名空间
- 1)作用
- 2)定义
- 3)命名空间中成员的使用
- a.通过作用域限定符(::)指定成员
- b.展开命名空间内的这个成员,将其暴露出来
- c.展开命名空间,将命名空间内的所有成员都暴露出来
- 4)命名空间的特点
- 2.缺省参数
- 1)全缺省和半缺省
- 2)缺省参数使用注意事项
- 3.输入输出
- 4.auto关键字
- 1)auto使用的细则
- 2)auto不能推导的场景
- 5.范围for
- 1)使用说明
- 2)使用条件
- 6.指针空值nullptr
- 7.引用
- 1)引用的使用
- 2)引用的特性
- 3)引用作为函数的参数和返回值
- 4)引用和指针的异同点
表示命名空间内的变量、方法和类是属于谁的,防止命名污染
编译器是很规矩的,如果两个变量名称相同,编译器就不知道该去调用哪一个,命名空间可以解决这个问题
也就是说如果有同名的变量、方法和类,只要它们属于不同的命名空间,使用的时候加上作用域限定符它们之间是不会相互影响的,编译器就能根据作用域限定符找到该变量、方法和类
namesapce 命名空间名
{命名空间内的对象和方法}
示例:
//定义一个命名空间
namespace somebody
{
char ch;
int b;
double c;
}
3)命名空间中成员的使用
a.通过作用域限定符(::)指定成员
命名空间名::成员名
示例:
somebody::ch = 'C';b.展开命名空间内的这个成员,将其暴露出来
using 命名空间名::成员名;
示例:
using somebody::ch; ch = 'a';c.展开命名空间,将命名空间内的所有成员都暴露出来
(这种方式不推荐使用,因为这样命名空间的作用就没有发挥出来,还不如直接定义在外面)
using 命名空间名;
using somebody; ch = 'a';4)命名空间的特点
a.可以跨源文件;
不同源文件中的成员只要有相同的命名空间名,编译器就会将它们合并到同一个命名空间中
b.命名空间可以嵌套;
嵌套命名空间用法:
外部命名空间名::内部命名空间名::成员名
嵌套命名空间使用示例:
#includenamespace Big { int a; namespace Small { int b; } } using std::cout; using std::endl; int main() { Big::a = 1; cout << Big::a << endl; //嵌套命名空间正确的用法 Big::Small::b = 2; cout << Big::Small::b << endl; return 0; }
2.缺省参数
缺省参数就是函数的默认参数,如果不指定就会使用这个默认值
1)全缺省和半缺省全缺省:所有函数参数都有默认值
半缺省:函数参数只有部分有默认值,有默认值的参数从右往左连续
全缺省和半缺省示例:
//全缺省
void Fun(int a = 1, int b = 2)
{}
//错误的半缺省,从右往左不连续
void Fun2(int a = 1, int b, int c = 3)
{}
//错误的半缺省,从右往左不连续
void Fun2(int a = 1, int b = 2, int c)
{}
//正确的半缺省
void Fun2(int a, int b = 2, int c = 3)
{}
2)缺省参数使用注意事项
缺省参数不能在函数声明和定义中同时出现,这不是一个规定,但最好遵守这个原则
因为同时出现时,如果声明和定义中的值不相同不会发生问题,而声明和定义的缺省值不同,编译器就不知道该调用哪一个,会有二义性
验证(vs2013):
default.h:
#pragma once #includeusing std::cout; using std::endl; void Fun(int a = 1, int b = 2);
default.cpp:
#include "default.h"
void Fun(int a = 10, int b = 24)
{
cout << "void Fun(int a = 10, int b = 24);" << endl;
}
test.cpp:
#include "default.h"
int main()
{
Fun();
return 0;
}
程序运行报错:
在Linux使用g++验证没有报错,取决于编译器
3.输入输出
C++的输入输出必须包含头文件iostream,并且使用命名空间std;
cin:输入
cout:输出
C++的输入输出不需要进行格式控制
4.auto关键字
auto关键字可以进行自动类型推导,
对于名称比较复杂或者比较长的类型,我们可以给编译器一个值,让编译器在编译期间自己推导这个值的类型,这样就减少了操作;
auto it = 1;1)auto使用的细则
a. 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&;
b. 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量;
a. auto不能作为函数的参数,因为函数参数在编译期间无法确定,编译器无法推导出变量的类型;
b. auto不能直接用来声明数组;
auto声明数组错误示例:
5.范围for
对于有范围的区间,不用指定范围就能对这个范围内的数据进行操作
1)使用说明for(类型名 迭代变量 : 迭代区间)
for内的类型名常常使用auto自动推导
示例:
int arr[] = {1,2,3,4};
for(int e : arr)
{
cout << e << " ";
}
cout << endl;
2)使用条件
for循环迭代的范围必须是确定的;
迭代的对象要实现++和==的操作;
6.指针空值nullptr
为什么C语言中已经有了指针空值NULL,C++还要引入nullptr?
因为C语言的NULL是一个宏,它有多个含义,可以表示字面常量0,也可以表示0的无类型指针,有时候在使用的时候会发生混乱,所以需要一个明确表示0的无类型指针的关键字nullptr;
注意对nullptr使用sizeof运算符时和对NULL使用sizeof运算符的结果是相同的
7.引用
引用是变量的别名,编译器不会为引用变量开辟空间,引用变量和它指向的变量同用一块内存空间
1)引用的使用类型名& 变量名 = 指向的实体;
示例:
int a = 1; int& ra = a;2)引用的特性
引用在定义时必须初始化;
一个变量可以有多个引用;
引用一旦引用一个实体,再不能引用其他实体;
引用作为函数的参数和返回值时效率更高,因为传入或者返回的是一个变量的指向。
但是引用作为函数的参数或者返回值使用时,要根据场景进行选择,不是所有情况都适合使用引用,有些情况下传值反而更好
4)引用和指针的异同点相同点:都是对于某个事物的指向;
不同点:
引用必须初始化,指针没有必须初始化的要求;
引用一旦指向一个实体,指向就不能发生改变,而指针的指向可以发生改变;
有多级指针,没有多级引用;
指针可以为空,引用不能为空;
在sizeof运算符中含义不同,引用表示它所指向的数据的大小,指针表示它自身的大小;
引用自加自减表示引用指向的实体+1或者-1,而指针自加自减表示指针向后或者向前偏移一个类型的大小;
访问实体方式不同,指针需要显示解引用,而引用编译器会自己处理;
引用比指针使用更加安全;
关于为什么引用比指针更安全,可参考下面的链接:
link



