解决问题:对标识符的名称进行本地化,以避免命名冲突或名字污染
使用方法:
::
,前面没有命名空间表示全局注意:
示例:
std::cout << "hello world";
using std::cout;
using namespace std;
使用:
#include <iostream>
int main() {
std::cout << "input: ";
int a = 0;
std::cin >> a;
std::cout << "output: " << a << std::endl;
return 0;
}
注意:取消缓冲区同步语句 std::ios::sync_with_stdio(false)
作用:缺省参数是声明或定义函数时为函数的参数指定一个默认值
分类:
void test(int a = 1, int b = 2, int c = 3)
void test(int a, int b = 1, int c = 2)
注意:
作用:C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)不同
使用
int Add(int left, int right);
int Add(int left, int right,int temp);
int Add(int left, int right);
double Add(double left, double right);
double Add(double left, int right);
double Add(int left, double right);
注意:
原理补充:
给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间
定义,相当于给已存在变量取了一个别名,用不同的变量名来标识同一块地址空间;
int a = 0;
int& b = a;
输出型参数,此时形参的改变会影响实参;
void swap(int* p1, int* p2);
void swap(int& r1, int& r2);
传引用返回,出了作用域返回的变量还在。调用函数栈帧的销毁,不影响返回值的生命周期;
如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。多用于:静态变量、全局变量、上一层栈帧、堆区等。
// 引用返回 1、减少拷贝 2、调用者可以修改返回对象
int& PosAt(AY& ay, int i){
return ay.a[i];
}
int main(){
int ret = Count();
AY ay;
for (int i = 0; i < N; ++i){
PosAt(ay, i) = i*10;
}
for (int i = 0; i < N; ++i){
cout << PosAt(ay, i) << " ";
}
cout << endl;
return 0;
}
区分引用和取地址,类型+&为引用,&+变量为取地址
引用定义时必须初始化
一个变量可以存在多个引用
引用一旦引用一个实体,不能再引用其他实体
值和引用的作为返回值类型的性能比较下,引用的作为返回值性能可能更优秀。
常引用:赋值/初始化时,权限可以不变或者缩小,但是不能放大(指针同理)
临时变量具有常性,函数返回为临时变量、类型转换(中间会产生临时变量),也只能用常引用
const int a = 2;
//int& b = a; 错误
const int& b = a; //正确
定义:以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。
使用
inline void test(int i){
cout << i << endl;
}
注意
作用:
使用
自动判断类型
int a = 10;
auto b = a;
范围for 意义和使用:自动依次取数组中数据赋值给e对象,自动判断结束
注意:for循环迭代的范围必须是确定的;迭代的对象要实现++和==的操作
void test(){
int array[] = { 1, 2, 3, 4, 5 };
for(auto& e : array)
e = 1;
for(auto e : array)
cout << e << " ";
return 0;
}
注意
auto e;
无法通过编译,使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。auto*
与auto&
,分别限定了必须为指针和引用NULL与nullptr的区别:
NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的
在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同