C++基础知识
函数:
- C++中对函数返回值有一定限制:不能是数组,但可以是其他任何类型------整数,浮点数,指针,结构体,对象(可以将数组作为结构体或对象的组成部分返回)。
int *ar, arr[ ]; //*ar指向数组arr,则arr[i]==*(ar+i)
//此时 sizeof ar;为指针变量的字节长度,
//sizeof arr; 为整个 数组的字节长度。
- 可以在函数声明和定义时这样做:
数据类型 函数名(const 数据类型 参数)
该函数中的参数形式 表明参数成了常量,即在该函数体内参数不可 修改。
-
使用数组区间的函数: (C++)
有一种方法是在函数中通过传递两个指针来表示整个数组的传入。一 个指针指向数组的首地址,另一个指针指向数组最后一个元素的后一个位置。
-
常量地址和地址常量:
const int *p; //此时*p指向的是const int类型,
//即一个常量。(常量地址)
int* const p; //此时p上存的地址是一个常量,不可修改。(地址常量)
-
关于cin:
int t=10; cin>>t;
当输入不是整数时,cin会将值留在缓冲区并返回一个即将被转化为false 的值,且在缓冲区中,cin 会留下一个错误标志,此时需要cin.clear()来清理错误标志。 -
函数指针:
返回值 函数名 (参数列表); //函数名中存储着整个函数的地址。
例子:
//函数指针:
void tink(double ,int);
void (*pf)(double ,int) =tink //函数指针pf
//可以像上面这样直接赋值,也可以单独赋值 pf=tink;
//要求:函数指针和函数的返回值,参数顺序,类型必须完全相同。
//函数指针数组:
void(*pf[3])(double,int)={tink1,tink2,tink3};
//tink1,tink2,tink3均为函数名
-
内联函数:
常规函数:程序运行至函数调用处时,编译器会记录该处的地址,并跳入函数所在的另一个存储空间执行代码,执行完毕后,编译器会通过之前记录的地址回到主函数,继续执行主函数中剩下的代码。
内联函数: 调用函数时,不再需要跳到其他空间,因为函数在与主函数在同一存储空间(节省了调用函数的时间,但却牺牲了存储)
用法:将函数的整个定义放在主函数中该函数的原型(即声明)处(替换);并在函数定义前加上关键字inline。
当函数频繁被调用时,可以将函数转化为内联函数。
引用变量:
-
引用是已定义的变量的别名,几个变量都可以使用,它们代表的是同一个地址上的数据。(一般用作函数的形参)
-
int a=10; int &b=a;
此时叫b对a的引用,即b为a的别名。&不再是取地址符,而是类型标识符的一部分。
-
引用必须在创建时进行初始化,且一旦与某个变量关联,就将一直忠于它。其更接近于const 指针即
int * const p;
----地址常量。引用变量作形参:
int add(int &a) {……}
-
C++中,引用参数尽可能地使用const :
使用const可以避免无意中修改数据造成的错误。
使用const可以使函数既可以接受const实参,也可以接受非const实参。
使用const引用可以使函数能正确生成临时变量(编译器自己生成一个符合形参的变量(临时),其值与传入的实参数值上相等,且这种临时变量只在函数调用时存在,此后便会被删除)。
- 一个父类的引用可以指向它自己的子类对象。传递类对象参数标准方式就是按引用传递。
函数模板:
template <typename T>
void Sdd(T a)
{……}
其中typename 关键字可以替换为class;T只是一个泛型,它可以是任何具体的类型(在同一个函数中T只能表示一种类型)。
-
显式具体化:模板重载-----即当形参个数一致时,在这种情况下,模板重载无法提供其他不同代码,此时就需要用到显式具体化。
写法:在函数原型(声明)和定义处以template<>打头。
写法1.
template<> void swap(int &a ,int &b)
写法2.
template<> void swap<int>(int &a,int &b)
优先级:非模板函数>显式具体化>模板函数-----编译器按照此优先级顺序查找,找到与函数调用匹配的定义时,将使用该定义,不再继续向下找。
C++11: 新增关键字decltype
int x; double y;
decltype(x)y;
//将变量y类型转换为变量x的类型。
x可以是一个函数,此时y就是函数返回类型。 decltype 本质是一个类型。
C++ 11后置返回值:
C++可以有这样一种声明: auto 函数名(参数列表)->返回值类型(如int) 这里的auto是一种新玩法。
静态变量:
C++ 有三种静态变量:
1.外部链接(可在其他文件中访问)。
2.内部链接(只能在当前文件中访问)。
3.无链接性(只能在当前函数或代码块中访问)。
1的定义方式:在代码块外声明变量(main函数外)
2的定义方式:在代码块外声明变量,并在前面加上static。
3的定义方式:在代码块内声明变量,并在前面加上static。
C++中使用全局const定义相当于使用了static全局定义一样。
例子:const int a=10; <------> static const int a=10;
定位new运算符
new关键字的重载需要引入头文件#include<new>
。使用new可以让用户指定要使用的位置。用法:
int value[500],*p1; *p1=new(value)char[20];
从value中分配空间给一个包含20个元素的char数组。(此空间在栈上)
自定义名称空间:
namespace Jack{
double pail;
void fun(){……}
struct PPT{……}
}
using jack::fun;
------这个叫using声明
using namespace jack;
-----这个叫using 编译指令。
使用using声明后,不能再在代码块中定义同名变量(此时using声明在代码块里),而使用using编译指令,则可以定义同名变量,且两个同名变量会相互覆盖。
若已经有个同名的全局变量pail;则名称空间中的pail会覆盖全局变量pail(using 声明或编辑指令在代码块中);
若要使用全局的pail,写法: ::pail
名称空间的嵌套
namespace myth{
using jack::fun;
namespace file{int a; ……}
}
使用file空间: myth::file;
空间别名:namespace mv=myth;