【c++】c++初识--基本知识梳理(2)

来源:互联网 发布:node.js硬实战115 pdf 编辑:程序博客网 时间:2024/06/01 10:16

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;}


0 0