C++ 基础知识
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是⼀种特殊类型的字⾯量,它可以转换成任意其他类型的指针类型。