一、命名空间
1.命名空间定义:
用法:namespace+命名空间的名字,然后后面是一对{},里面则为该命名空间的内容。
namespace N1{
int a;
int Add(int left, int right)
{
return left + right;
}
}
注意:
命名空间可以进行嵌套。
namespace N1{
int a;
int Add(int left, int right)
{
return left + right;
}
namespace N2{
int b;
int Sub(int big, int small)
{
return big - small;
}
}
}
同一个工程可以存在相同名称的命名空间,编译器之后会把合成一个命名空间 。
namespace N1{
int a;
int Add(int left, int right)
{
return left + right;
}
namespace N2{
int b;
int Sub(int big, int small)
{
return big - small;
}
}
}
namespace N1{
int c;
double e;
}
2.命名空间的使用:
三种方法:
1) 命名空间名称及作用域限定符。(N1::a就是此用法)
int main()
{
cout << N1::a << endl;
system("pause");
return 0;
}
2)使用using将命名空间的成员进行引入,之后便可以直接使用。(using+命名空间名+作用域限定符引入了a)
using N1::a;
int main()
{
cout << a << endl;
system("pause");
return 0;
}
3)使用using namespace将命名空间进行引入,之后进行直接使用。(using namespace+空间名引入其内部的所有成员)
using namespace N1;
int main()
{
cout << a << endl;
system("pause");
return 0;
}
二、输入和输出
1.C++中使用cin和cout进行输入和输出。
2.输入和输出包含在<iostream>头文件中。
3.cin和cout包含在std的命名空间中。
4.c的输入输出仍然可以在此使用。
5.C++输入输出时,不在需要增加格式控制。
#include <iostream>
using namespace std;
int main()
{
int a;
double b;
char c;
cin >> a;
cin >> b >> c;
cout << a << endl;
cout << b << " " << c;
system("pause");
return 0;
}
三、缺省参数
定义:当声明或者定义函数时,将其参数给一个默认值。在调用时,如果传参数,则用传入的值,否则用默认值。包含全缺省和半缺省。
1.全缺省参数
就是将其函数的参数全部给定一个默认值。
#include <iostream>
using namespace std;
int Test1(int left = 20, int right = 10)
{
return left - right;
}
int main()
{
system("pause");
return 0;
}
2.半缺省参数
意思是将函数参数的默认值给其中的一部分。
#include <iostream>
using namespace std;
int Test1(int left , int right = 10)
{
return left - right;
}
int main()
{
system("pause");
return 0;
}
3.注意事项:
1)半缺省参数默认值的提供必须从右向左,不可以跳跃的给出。
2)缺省参数不能同时在声明和定义中出现。如果有函数声明时,只能在声明中出现,不能在定义中出现。
3)缺省的默认值必须是常量或者全局变量
4)C语言中不支持
四、函数重载
1.概念和用法
在同一作用域中声明了几个功能类似的同名函数,函数的形参列表(参数的个数、参数类型、顺序)必须不同。
2.名字修饰(name Mangling)
C++就是用名字修饰来解决函数重载的问题,它是在编译过程中,将函数、变量名称重新改编,此时便可以唯一的标识重载函数。
在C语言中名字修饰,就是在函数名便面加上下划线(_),因此不能出现函数重载。
3.extern "c"
将函数的前面加上extern "c",则该函数将会按照C语言风格进行编译。
问题1:C语言为什么支持函数重载?
因为C语言的名字修饰非常简单,只是将函数名的前面加上下划线(_)来表示这个函数,则将功能类似的同名函数解析出来的标识是相同的。
问题2:C++重载函数是如何处理的?
利用名字修饰(name Mangling)根据函数、变量名名称对函数名进行进一步的解析,变为唯一标识次功能的名称。
问题3:C++能否将一个函数按照C的风格来编译?
在该函数的前面加上extern "c",便可以按照c风格来进行编译。
五、引用
1.引用的概念和特性
概念:不是定义一个新的变量,而是给已经存在的变量取了一个别名。编译器不给它开辟新的空间,而是和引用的变量公用同一块内存空间。
用法:类型&引用变量名(对象名) = 引用实体;
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int &ra = a;
cout << ra << endl;
system("pause");
return 0;
}
注意:引用类型必须和实体是同种类型。
特性:
1)引用在定义时必须初始化。
2)一个实体可以有多个引用。
3)引用一旦存在一个实体,则不能在引用其它实体。
2.使用场景
1.做参数
void swap(int &left, int &right)
{
int tmp = left;
left = right;
right = tmp;
}
2.做返回值
int& add(int &a)
{
a += 10;
return a;
}
注意:不能返回栈空间上的引用。
3.效率比较
1)传值、传址和引用的效率比较
传址和引用在传参上的效率几乎是相同的。
但是传值的效率会比他俩慢很多
2)引用和指针的区别
注意:在语法上面,引用只是一个别名,不占用内存空间,但是在实际实现时,是按照指针的方法实现的。
a) 引用在定义的时候必须要初始化,但是指针没有要求。
b) 引用初始化时引用一个实体,就不可以在引用其他实体 了;而指针可以在任何时刻指向任何一个同类型的实体。
c) 没有NULL引用,但是存在NULL指针。
d) sizeof的含义不同:在引用中表示的是该实体类型的大小;指针则表示的是地址空间所占的字节数(32位平台下占4字节)。
e) 存在多级指针,但是没有多级引用。
f) 访问实体的方式不同,指针需要显式解引用,引用则是编译器自己处理。
g) 引用比指针使用起来更加安全。
六、内联函数
1.概念和用法:
用inline修饰的函数就叫做内联函数,在编译时C++编译器会在该处进行展开,没有压栈开销,提高了运行的效率。
2.特性
inline是一种空间换时间的做法。
所以循环、递归或者代码很长的时候不适合用内联函数。
面试题1:宏的优缺点?
优点:增强代码的复用性、提高性能
缺点:不方便调试、代码的可读性差、可维护性差、没有类型安全检查。