5.引用VS指针
(1)作用:引用是给变量起一个别名;
(2)定义引用的一般格式:
类型 &引用名 = 变量名;
例如:
int a = 1;int &b = a; //b是的别名,因此a和b是同一个单元(PS:定义引用时一定要初始化,指明引用变量是谁的别名)
在实际应用中,引用一般用作参数传递与返回值。
(3)const引用是指向const对象的引用
const int ival = 1024; //const int& refval = ival; //正确int &ref2 = ival; //错误(4)函数传参:按引用传递
引用传递方式是在函数定义时在形参前面加上引用运算符&;
例如:voidswap(int &a, int &b);
引用作为参数对形参的任何操作都能改变响应的实参数据,又使函数调用显得方便、自然。
(5)引用可作为函数的返回值,放在赋值运算符左边;
#include<iostream> using namespace std; int& func(int &num){ return num;} int main(){ int num=1; func(num)=7; cout<<"num = "<<num<<endl; return 0;}结果为:num = 7;
(6)引用与指针的区别
引用访问一个变量是直接访问,而指针是间接访问;
引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间;
引用一经初始化不能再引用其他变量,而指针可以重新指向其他变量。
(尽可能使用引用,不得已时使用指针)
6.函数升级
(1)内联函数的使用
inline int add(int a, int b){ return a + b;}inline int add(int a, int b){
return a + b;
}
宏函数
#define ADD(a, b) a + b(2)内联函数与宏函数的区别
内联函数调用时,要求实参和形参的类型一致,另外内联函数会先对实参表达式进行求值,然后传递给形参;而宏调用时只用实参简单地替换形参。
内联函数是在编译的时候,在调用的地方将代码展开,而宏则是在预处理时进行替换的;
在c++中最好用inline函数替代带参数的宏。
(3)函数重载(overload)
定义:相同的作用域,如果两个函数名称相同,而参数不同,称为重载(overload)
条件:编译器通过检查实际参数的个数、类型和顺序确定相应的被调用函数。
name managling(名字改编):c++为了支持重载,会将相同的函数名根据形参的不同而改编成不同的名字加以识别。
实现c与c++混合编程:extern “C”
ifdef __cplusplusextern “C”{#endif……#ifndef __cplusplus}#endif带默认形参值的函数:
函数没有声明时,在函数定义中指定形参的默认值;
函数既有定义又有声明时,声明指定后,定义时就不能再指定默认值;
默认值的定义必须遵守从右到左的顺序,如果某个形参没有默认值,则它左边的参数就不能有默认值。
voidfunc(int a, double b = 4.2, int c= 3); //合法 voidfunc(int a = 3, double b, int c = 3); //不合法函数调用时,实参与形参按从左到右的顺序进行匹配。
7.命名空间
(1)c语言 VS c++
c语言中所有的全局标识符共享同一个作用域,标识符之间可能发生冲突
c++中提出了命名空间的概念:
命名空间将全局作用域分成不同的部分;
不同命名空间中的标识符可以同名而不会发生冲突;
命名空间可以互相嵌套;
全局作用域也叫默认命名空间。
(2)如何定义命名空间
c++命名空间的定义:
namespace name{…}
namespace First{ int I = 0;}namespace Second{ int I = 1; namespaceInternal { struct p { int x; int y; }; }}(3)c++命名空间的使用
使用整个命名空间:using namespace name;
使用命名空间中的变量:using name::variable;
使用默认命名空间中的变量:::variable
示例:
#include<iostream> usingnamespacestd; namespaceFirst{ inti=1;}namespaceSecond{ inti=2; namespaceInternal { structmystruct { intx; inty; }; }} int main(){ usingnamespaceFirst; usingSecond::Internal::mystruct; cout<<"i = "<<i<<endl; cout<<"second i = "<<Second::i<<endl; mystructnode={3,4}; cout<<"node.x = "<<node.x<<endl; cout<<"node.y = "<<node.y<<endl; return0;}
新闻热点
疑难解答
图片精选