1、 namespace的定义
- 本质是定义一个域,不同的域可以定义同名变量;C++的域有全局域、局部域、命名空间域、类域
- namespace只能定义在全局,也可以嵌套
- C++的标准库被放在std(标准模板库中)
#include <stdio.h>
#include <stdlib.h>
namespace yc
{
// 命名空间中可以定义变量/函数/类型
int rand = 5;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
int main()
{
// 这⾥默认是访问的是全局的rand函数指针
printf("%p\n", rand);
// 这⾥指定yc命名空间中的rand
printf("%d\n", yc::rand);
return 0;
}
//2. 命名空间可以嵌套
namespace yc
{
namespace ya
{
int rand = 1;
int Add(int left, int right)
{
return left + right;
}
}
namespace yb
{
int rand = 2;
int Add(int left, int right)
{
return (left + right)*10;
}
}
}
int main()
{
printf("%d\n", yc::ya::rand);
printf("%d\n", yc::yb::rand);
printf("%d\n", yc::ya::Add(1, 2));
printf("%d\n", yc::yb::Add(1, 2));
return 0;
}
2、命名空间使用
- using:将命名空间中某个成员展开,平时学习可以使用,大型项目不建议使用,也就是展开成员的意思。
`// using展开命名空间中某个成员
using A::b;
int main()
{
printf("%d\n",A::a);
printf("%d\n",b);
}
// 展开命名空间中全部成员
using namespace A;
int main()
{
printf("%d\n",a);
printf("%d\n",b);
return 0;
}
3、C++输入和输出
- std::cin面向窄字符的标准输入流,std::cout面向窄字符的标准输出流
- std::endl相当于一个换行字符加速缓冲区
- << 流插入运算符,>>流提取运算符
- C++的输入输出自动识别变量类型
4、缺省参数
缺省分为全缺省和半缺省
- 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。
5、函数重载
- C++⽀持在同⼀作⽤域中出现同名函数,同名函数的形参不同,可以是参数个数不同或者类型不同。
// 1、参数类型不同
int Add(int a, int b)
double Add(int a, int b)
// 2、参数个数不同
void f()
void f(int a)
// 3、参数类型顺序不同
void f(int a, cahr b)
void f(char b , int a)
// 返回值不同不能作为重载条件,因为调⽤时也⽆法区分
void f()
int f()
6、引用
6.1引用的概念和定义
引用定义:给已经存在的变量取别名,不会新开辟内存,和引用的变量共用一块内存
类型& 引用别名 = 引用对象
// 引⽤:b和c是a的别名
int& b = a;
int& c = a;
// 可以给别名b取别名,d相当于还是a的别名
int& d = b;
// 根据引用不改变名字,也不会开辟内存空间,共用一块内存,下面输出的结果是相同的。
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << &d << endl;
6.2 引用的特性
- 引用在定义的时候必须初始化,int& b = a;
- 一个变量可以有很多个引用
6.3 引用的使用
- 用途:引用传参和引用返回,减少拷贝提高效率
- 引用传参和指针传参类似,引用传参更方便。
7、const引用
const int a = 10;
// 编译报错:error C2440: “初始化”: ⽆法从“const int”转换为“int &”
// 这⾥的引⽤是对a访问权限的放⼤
//int& ra = a;
// 这样才可以
const int& ra = a;
// 编译报错:error C3892: “ra”: 不能给常量赋值
//ra++;
// 这⾥的引⽤是对b访问权限的缩⼩
int b = 20;
const int& rb = b;
// 编译报错:error C3892: “rb”: 不能给常量赋值
//rb++;
8、指针和引用的关系
- 引用是取别名不用开空间、指针存储要开空间
- 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
- 引用可以直接访问引用对象,指针需要解引用才能访问指向对象
9、inline
- inline修饰的叫做内联函数,调用时建立栈帧,提高效率
- 使用频繁调用的短小函数,不适合循环和递归
10、nullptr
- C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换成任意其他类型的指针类型。