前言:接命名空间(namespace):https://blog.csdn.net/hedhjd/article/details/140333067?spm=1001.2014.3001.5501
C++的标准库都在一个叫std的命名空间里
1. <iostream> 是标准的输⼊、输出流的头文件
2. std::cin 是 istream 类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输⼊流
3. std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流
4. std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区
5. <<是流插⼊运算符,>>是流提取运算符。(C语⾔中叫做位左移操作符/右移操作符)
6. C++的输⼊输出可以⾃动识别变量类型,而且C++的流能更好的⽀持⾃定义类型对象的输⼊输出
#include <iostream>
using namespace std;
int main()
{
int a = 0;
double b = 0.1;
char c = 'x';
//可以⾃动识别变量的类型
//输入
cin >> a >> b >> c;
//输出
cout << a << endl;
cout << b << " " << c << endl;
return 0;
}
endl:目前可以看成流插入的换行符
7. cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使用方式去用他们。
8. C++中没有包含<stdio.h>,也可以使⽤printf和scanf,因为<iostream>间接包含了
缺省参数就是在形参的地方给一个缺省值(默认值)
1. 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参则采⽤该形参的默认缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数
如:
int main()
{
// 没有传参时,使⽤参数的默认值
Func();
// 传参时,使⽤指定的实参
Func(10);
return 0;
}
2. 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。
// 全缺省
void Func1(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
// 半缺省
void Func2(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值
3. 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参
4. 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须在函数声明给缺省值
C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参(参数)不同,可以是参数个数不同或者类型不同。C语⾔是不⽀持同⼀作⽤域中出现同名函数的
1.参数类型不同
//参数类型不同
int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(double left, double right)" << endl;
return left + right;
}
2.参数个数不同
void f()
{
cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
3.参数类型顺序不同
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}
返回值不同不能作为重载条件,因为调⽤时也⽆法区分
权限放大和缩小只会存在指针和引用
引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间,也就是说引用是不开空间的,它和它引用的变量共用同⼀块内存空间
类型& 引⽤别名 = 引⽤对象;
int& b = a;
1. 引用在定义时必须初始化 2. ⼀个变量可以有多个引用 3. 引用⼀旦引用⼀个实体,再不能引用其他实体
&引用符号放在对象的前面就是取地址
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << &d << endl;
&放在类型的后面就是引用
int& b = a;
int& c = a;
引用:就相当于一个人自己的名字和在学校里的外号 ,也就是取别名
int main()
{
int a = 0;
// 引⽤: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;
return 0;
}
1. 引用在实践中主要是用于函数调用的过程中的传参 和 返回值
传值传参是拷贝
2. 引用传参跟指针传参功能是类似的,引用传参相对更⽅便⼀些
3. 引用和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引用定义后不能改变指向
1. 可以引用⼀个const对象,但是必须用const引用
const int a = 10;
int& ra = a;//这个是不可以的
上面的引用是对a访问权限的放大,是不可以的,正确方式是:
const int& ra = a;
const引用也可以引用普通对象,因为对象的访问权限在引用过程中可以缩小,但是不能放大
这段代码是给b取别名但是不改变,也就是只读不写 ( 这⾥的引⽤是对b访问权限的缩⼩,但是不能放大)
int b = 20;
const int& rb = b;
const引用也可以给常量取别名:
const int& ra = 30;
2. 不需要注意的是类似 int& rb = a*3; double d = 12.34; int& rd = d; 这样⼀些场景下a*3的和结果保存在⼀个临时对象中, int& rd = d 也是类似,在类型转换中会产⽣临时对象存储中间值,rb和rd引用的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥就触发了权限放大,必须要用常引用才可以
临时对象具有常性,普通&不可以,会出错,但是const&可以
const int& rd = d;
int& rb = (a+b),其中(a+b)是一个临时对象,具有常性,临时对象rb =(a+b)就是把(a+b)的结果拷贝给rb
3.所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象, C++中把这个未命名对象叫做临时对象
权限放大:
const int& a = 10;
int& ra = a;
拷贝:
const int& a = 10;
int ra = a;
1. C++中指针和引⽤在实践中他们相辅相成,功能有重叠性,但是各有⾃⼰的特点,互相不可替代
2. 引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间
3. 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的
4. 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象,只能引用一个对象;而指针可以在不断地改变指向对象
5. 引用可以直接访问指向对象,指针需要解引用才是访问指向对象
6. sizeof中含义不同,引用结果为引用 类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
7. 指针很容易出现空指针和野指针的问题,引用很少出现,引用使用起来相对更安全⼀些
1.inline是用来修饰函数的,用inline修饰的函数叫做内联函数,编译时C++编译器会在调用的地⽅展开内联函数,这样调⽤内联函数就不需要建⽴栈帧了,就可以提⾼效率
2. inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略
3. C++设计了inline目的就是替代C的宏函数
4.inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函地 址,链接时会出现报错
感谢观看~