C++入门
命名空间
-
在c/c++中,变量,函数和类都是大量存在的,这些变量,函数和类的名称都存在全局作用域中,可能会导致很多冲突。使用命名空间就是解决命名的冲突了,
namsepace
就是建立命名空间的关键词。 -
::
域作用限定符。 -
#include <iostream> int a = 1; //建立一个域名N namespace N { int a = 2; } int main() { int a = 3; //优先访问局部域a,如果局部没有就去全局查找 std::cout << a << std::endl; //全局里查找变量a std::cout << ::a << std::endl; //只在域名N中查找变量a std::cout << N::a << std::endl; return 0; }
-
在域名中可以创建变量,函数和类和域名。
-
namespace N { int a = 1; int Add(int x, int y) { return x + y; } class data { public: data(int year = 2020, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } prative: int _year; int _month; int _day; }; namespace M { int a = 2; } }
-
相同域名可以合并。
-
namespace N { int a = 1; } namespace N { int b = 1; }
-
为了和c区分,c++的标准头文件没有用.h。这样c++的标准库命名空间std就可以合理使用了。
-
//将命名空间展开 using namespace std; //将std中的cout展开(展开某一变量变量名或函数等展开) using std::cout;
缺省函数
-
缺省函数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参时,采用该函数形参的缺省值,否则使用指定的实参。
-
//全缺省 int Add1(int x = 0, int y = 0) { return x + y; } //半缺省函数,没有缺省值的参数只能从左到右,否则语法错误 int Add2(int x, int y = 0) { return x + y; } int main() { //使用缺省值 int ret1 = Add1(); //使用实参值 int ret2 = Add1(2, 22); //半缺省函数必须传值给没有缺省值的那个形参,且顺序是左到右依次赋值,不能间隔赋值 int ret3 = Add2(1); int ret4 = Add2(1, 2); }
-
缺省函数在传缺省值时,在定义时给。
函数重载
-
c++允许在同一作用域中声明几个类似的同名函数,这些函数的形参列表(数量,类型,类型顺序)不同,常用来处理功能类型,数据类型不同的问题。
-
#include <iostream> using namespace std; int Add(int x, int y) { return x + y; } double Add(double x, double y) { return x + y; } int main() { //自动识别类型调用 int Add(int x, int y) cout << "1 + 1 = " << Add(1, 1) << endl; //如果没有 double Add(double x, double y) 就调用 int Add(int x, int y) cout << "1.1 + 1.1 = " << Add(1.1, 1.1) << endl; return 0; }
-
构成重载的方法有许多种,权限,但是重载函数和缺省函数搭配时容易出现调用歧义,写重载函数尽量避免出现调用歧义的情况。
-
//如果两个函数你都不传参数,那么会出现调用歧义。 int Add() { return 1 + 1; } int Add(int x = 1, int y = 1) { return x + y; }
-
c语言中不可以出现函数的重载,这是应为c语言直接将函数名用于编译后函数名不变,而c++会将形参参数加入函数名修饰规则,修饰后不同形参的相同函数名会改成不同的函数名。
引用
-
引用不是定义了一个新的变量,而是给已经存在的变量取别名,编译器不会为它开辟新的内存空间,而是和原有的变量用同一个内存地址。
-
在c++中指针和引用的使用时都必须遵守权限的平移或权限的缩小原则。
-
#include <iostream> using namespace std; int main() { //引用必须创建时就必须初始化, int x = 1; int &rx = x; //在c++中指针和引用的使用必须都要遵守权限平移和权限缩小原则 //在类型不同的两个变量之间赋值,会产生临时的常变量,这个值不可别修改,所以当ry引用y的时候其实引用的是临时产生的常变量 double y = 1.1; const int &ry = y; return 0; }
-
引用的使用做返回值,做参数。
-
int& sum() { static n = 1; n++; return n; } //两个值的交换不用传指针 void swap(int &x, int &y) { int tmp = x; x = y; y = tmp; }
-
引用的错误用法。在栈中定义了变量就不要使用引用,这样会造成野引用现象。
-
int& Fun(int x) { int n = 3; n += x; return n; }
-
引用的效率很高,因为它没有开辟新空间,而是直接使用原有空间。
-
不同值类型之间引用会有临时常变量产生。因此引用时必须有
const
关键词修饰。 -
int main() { int x = 1; const double &rx = x; return 0; }
内联函数
-
c语言中宏的优点有:增强代码的复用性,提高性能。缺点:不方便调试,代码可读性差,可维护性差,容易误用,没有类型的安全的检查。c++中的内联函数刚好掩盖的宏的缺点。c++可以用
const enum
代替宏定义的常量,用内联函数替代短小的函数定义。 -
以
inline
修饰的函数叫做内联函数,编译时c++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。 -
内联函数定义声明最好不要分离,因为编译器会将内联函数自动展开不会给它建立符号表对应关系,如果定义和声明不在同一个文件,那么就相当于只是定义了函数,而没有声明它。
-
inline int Add(int x, int y) { return x + y; } int main() { return 0; }
-
默认
inline
在Debug版本下不会有作用,否则不方便调试,需要自己动手更改配置。
C++一些新用法
-
auto
关键字,作为一个新的类型指示符,它的作用是自动推导变量或常量的类型。但是它不能用作函数参数的声明,或者数组声明。 -
用
auto
或auto*
声明指针时没有任何区别,但是声明引用时必须加&。 -
int main() { int x = 1; auto y = x; auto px1 = &x; auto *px2 = &x; auto &rx = x; return 0; }
-
基于
auto
实现的范围for
循环,也叫语法糖。 -
int main() { int arr[] = { 1,2,3,4,5,6,7,8,9 }; for (int &x : arr) { cout << x << endl; } for (auto &y : arr) { cout << y << endl; } return 0; }
-
nullprt
,c++空指针的关键词,它不同于NULL
是一个真正无类型的空指针。在c/c++中NULL
定义如下。 -
#define NULL 0 #define NULL ((void*)0)
-
nullprt
,c++空指针的关键词,它不同于NULL
是一个真正无类型的空指针。在c/c++中NULL
定义如下。 -
#define NULL 0 #define NULL ((void*)0)
-
因此在c++中遇到空指针类型尽量用
nullptr
。