1、using namespace std;
1、namespace 是命名空间,是一个域,他的作用是数据隔离。std是C++提供的一个命名空间,这里包含了所有的C++库函数。
2、访问命名空间有两种方式:
1) using namespace std;
//这种方式会将命名空间中的所有特定的用法给展开,这样类似于 cout/cin 这样的特定的输入/输出语句就不能再被使用,就像是关键字一样。但是这样也可以很方便的使用的。
2) std :: cout;
//这种方式是利用域访问符进行访问。比较麻烦,每一个在这个命名空间的函数的使用都需要这样处理。
3、其中,命名空间可以嵌套定义
2、头文件<iostream>
不同于C语言的头文件定义,C++的头文件现在是不在后面加上 .h。
3、重载
1、重载定义:在同一个作用域,同一函数名在不同的函数形参下可以存在,返回值可以相同可以不同。形参的不同指的是数量的不同或者类型的不同。
2、仅仅只有返回值不同是不能够构成重载的。
3、C++是利用函数的命名修饰规则来实现重载功能,见下面的例子:
void Add1(int a, int b); //_Z4Add1ii
void Add1(char a, int b); //_Z4Add1ci
Linux下用g++ -o Add text.c
编译,然后用 objdump -S Add
查看其源代码的汇编代码,可以看到两者的差别
root用户下:yum install gcc gcc-c++
装g++编译器
4、重载的时候,利用到一个缺省参数
1)全缺省
int Add(int a = 10, int b = 5)
{
return a + b;
}
调用函数的时候:
Add( ) => 30
Add(5) =>25
Add(2, 3)=>5
Add( ,5) => 错误的使用
2)半缺省
int Add(int a, int b = 30); //正确
int Add(int a = 10, int b); //错误
4、指针和引用
1、引用的定义:引用不是一个新的变量,而是变量名的别名
int a = 10;
int& b = a;
2、const在引用时候的作用
const int a = 10;
int& b = a; //错误,因为a 是不可修改的,但是b 却是可以修改的类型
const int& b = a; //正确
int c = 10;
double d = 20;
int& e = d; //错误,因为d 是double类型,将它转化为 int 需要一个临时变量的调用,而这个临时变量是常量类型
const int& e = d; //正确
3、引用的几个点
1)引用作为参数传递的时候,可以直接改变原来的变量的值;这是因为引用和原变量的地址是一致的。这种做法类似于将指针的地址进行了传递
2)引用可以提高效率,类似于地址传参,不需要将所有的数据进行临时拷贝
3)当我们不想修改函数参数的值时,一般用const
修饰引用
4、引用作为返回值
int& Add(int a, int b)
{
int ret = a + b; //(static int ret = a + b;)这样修改,改程序就没有问题
return ret;
}
int main()
{
int a = 3;
int b = 4;
int& c = Add(a, b);
cout << c << endl; // 7 (已越界) //若修改,未越界
Add(10, 15);
cout << c << endl; // 25 //若修改了,输出 7
}
int& =>此时返回ret的是别名,用int& c接收,但ret 是临时变量,出了作用域就被销毁了
第一次打印C的时候,C的地址,即ret 的地址已经返回个操作系统,但是因为未修改,所以依旧输出7。第二次,就修改了,所以输出了25。
若要返回一个临时变量的值,就不返回其引用。若要返回其作用域仍存在(静态变量,传进的变量值),并且当数据较大的时候,用引用较为合适。
5、指针和引用
1)引用只能初始化一次,并且必须初始化。
2)sizeof,对指针是 4 或 8 ,对应 32位机器,64位机器;对引用是与其类型大小一致
3)引用做参数的时候,一般不需要判空,较为安全
4)引用在语法层面,没有开辟空间,指针有开辟空间。但是在底层的汇编代码,两者其实都是开辟了空间的