C++关键字(C++98) 有63个
命名空间解决了:名字冲突,有作用域的作用
命名空间的使用格式:
namespace N1
{
1.变量
2.函数
3.命名空间(嵌套使用)
}
使用方法:
1. N1::变量
2. using N1::变量;
3. using namespace N1;
C++的输入输出
头文件:iostream
命名空间:using namespace std;
使用:
int a;
cin>>a;
cout<<"hello"<<endl;
//十六进制打印
cout<<hex<<a<<endl;
缺省参数
void test(int a = 0)
{
cout<<a<<endl;
}
int main()
{
test(10);
test();
return 0;
}
全缺省参数
如果没有传递对应参数,则用默认缺省值
传参的时候从右往左传递(约定的)
半缺省参数
部分参数带有缺省值
++注意++:
半缺省参数应该要从右边开始给,不能有空一个参数,即从右往左参数要连续赋值
不能这样写:
void test(int a = 1, int b , int c = 3)
这样是对的:
void test(int a, int b = 2, int c = 3)
{
//对于这种形式,没有缺省参数的必须要在函数的实现中给他赋值
test(10);
test(10,20);
test(10,20,30);
//所以下面这种方式是错误的
test();
}
注意:
缺省参数不能再函数声明和定义中同时出现,写在函数声明中即可
缺省值必须是常量或者全局变量
函数重载
++在同一作用域++声明几个功能类似的同名函数
**这些同名函数的形参列表(参数个数、类型、顺序)必须
不同,常用来处理实现功能类似数据类型不同的问题**
简记:作用域相同,函数名相同,参数不同,仅仅是函数的返回值类型不同是无法构成重载的
int add(int a, int b)
{
return a+b;
}
double add(double a, double b)
{
return a+b;
}
编译器会识别参数类型,来调用匹配的函数
C和C++对同名函数处理:
注:C不支持函数重载
C:在函数名前加了一个下划线
C++:(?add@@YA HHD @Z)
HHD 代表返回值,参数一的类型,参数二的类型
C++还考虑了参数的类型,所以C++支持函数重载,而C语言不支持。
在C++工程中按照C的风格来编译:
extern "C" int add(int a,int b);
引用
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
注意:引用类型必须和源数据类型相同
引用在定义时必须初始化
一个变量可以有多个引用
引用一旦引用一个实体,再不能引用其他实体
常引用
const int a = 10;
const int& ra = a;
const int& r = 10;
double d = 12.34;
const int& rd = d;//这时 d 和 rd 的地址不一样了
//数组的引用
int arr1[10];
int (&rarr1)[10] = arr1;
rarr1[0] = 10;
double d = 12.34;
const int& rd = d;//这时 d 和 rd 的地址不一样了
解答:数据会被截断,放到另一个临时空间,rd已经是临时空间的别名了
传引用交换两数
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp
}
如果不想改变外部实参
可以加入const
void fun(const int& a);
注意
int& test()
{
int a=0;
return a;
}
int main()
{
int& ra = test();
cout<<ra<<endl;//10
cout<<ra<<endl;//随机值
return 0;
}
解决方法:将int a=0;做成全局变量,即移到函数外或者
int& test(int& a)
{
return a;
}
int main()
{
int a=0;
int& ra = test(a);
cout<<ra<<endl;//10
cout<<ra<<endl;//随机值
return 0;
}
引用和指针的相同点
引用和指针在底层的处理方式都是一样的。
引用形式 | 指针形式 |
---|---|
T& | T* const |
const T& | const T* const |
引用和指针的不同点
- 引用在定义时必须初始化,指针没有要求
- 一旦一个引用被初始化为指向一个对象,就不能再指向其他对象,而 指针可以在任何时候指向任何一个同类型对象
- 没有NULL引用,但有NULL指针
- 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地 址空间所占字节个数
- 引用自加改变变量的内容,指针自加改变了指针指向
- 有多级指针,但是没有多级引用
- 指针需要手动寻址,引用通过编译器实现寻址
- 引用比指针使用起来相对更安全
内联函数
用inline修饰,在程序编译时,使用内联函数的会自动展开
inline int add(int a, int b)
{
return a+b;
}
int main()
{
int a=1;
int b=2;
cout<<add(a,b)<<endl;
return 0;
}
在debug模式下,实际发现并没有展开,还是调用函数(call)
在release模式下,查看汇编代码,有push 3;说明直接计算出了结果。将结果替换了
在release模式下,编译器会大量优化。
一般在debug模式下,不会进行优化
inline 以空间换时间
当出现递归或者很长的循环时,或者代码太长,则会忽略inline,inline对编译器只是一个建议
C++中替代宏的方法:
常量定义 换用 const
函数定义 换用 内联函数
类型重定义 换用 typedef