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

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 __cplusplus
extern “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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值