C++对C的扩展

文章内容如下:

1)面向过程、面向对象

2)作用域运算符

3)命名空间 与 using声明 命名空间的成员可用

4)   引用

5)内联函数

6)函数重载

7)函数的默认参数

8)占位参数

9)extern "C"

一。面向过程、面向对象

        面向过程指的是分析出解决问题所需的步骤,然后一步一步去解决。面向对象指的是通过若干对象的组合去解决问题,对象就是指一个个程序实体,具体而言就是对象=算法+数据结构。C是面向过程的,C++是面向对象的。

        面向对象的三个特点:封装、继承、多态。封装就是把数据和方法封装在一起,加以权限区分,用户只能通过公共方法操作数据。继承是指类与类之间的关系,具体而言就是一个类可以继承另一个类的特征和能力。多态指的是一个接口多种方法,指的是一个函数有多种功能。

二。作用域运算符::

        作用域运算符::谁是谁的谁,解决的是归属问题。常见用法如下:

当全局变量和局部变量同名时,可以对变量名前加作用域运算符去访问全局变量

 三。命名空间namespace 与 using声明 命名空间的成员可用

        给标识符添加作用域叫命名空间,用namespace做关键字,说通俗点就是给变量套个马甲加以区分,不然名字一样没办法区分,主要是防止命名冲突。主要用法如下:

1.创建命名空间

namespace A {
    int a = 10;
}

namespace B {
    int a = 20;
}

void test()
{
    count << "A:: a:" << A :: a << endl;//10
    count << "B:: a:" << B :: a << endl;//20
}

2.命名空间只能全局范围内定义

3.命名空间可以嵌套命名空间

namespace A {
    int a = 10;

    namespace B {
        int a = 20;
    }
}

void test()
{
    count << "A:: a:" << A :: a << endl;//10
    count << "A:: B:: a:" << A:: B :: a << endl;//20
}

4.命名空间是开放的,即可以随时把新的成员函数加入已有的命名空间中。什么意思呢,就是命名空间这个马甲可以在多个地方同时使用,最终相同的马甲名它会自己把内容综合到一起。

5.申明和实现可以分离,但实现要指明来自于哪里——来自于命名空间一定要加上命名空间的马甲,不然就是一个普通的函数

namespace Myspace {
    void func1();
    void func2(int param);
}

void Myspace::func1(){//一定要有Myspace::,不然就是一个普通的函数func1,跟命名空间没有半毛钱关系
    count << "Myspace :: func1" << endl;
}

void Myspace::func2(int param){
    count << "Myspace :: func2 :" << param << endl;
}

6.无名命名空间,即命名空间没有名字,这意味着命名空间中的标识符只能在本文件中使用,标识符可以直接调用,不用说明谁属于谁,这也相当于给这个标识符加上了static,使得其作为内部链接,外部文件是访问不了的

namespace{
    int a = 10;
    void func(){count << "hello wnamespace" <<endl;}
}

void test(){
    count << "a : " << a << endl;
    func();
}

7.可以给命名空间取别名。什么意思呢,当命名空间名字太长时,可以去个短的别名,以后可以用这个别名去访问命名空间的成员,当然原来的名字仍然是可以访问的,并不会失效。

namespace veryLongName{
    int a = 10;
    void func(){count << "hello namespace" << endl;}
}

void test(){
    namespace shortname = veryLongName;
    count << "veryLongName :: a " << shortname :: a << endl;
    veryLongName :: func();
    shortName :: func();

}

using声明 命名空间的成员可用

        老是使用命名空间名字加上标识符来查找某一个标识符这当然没有问题,但是也是会很麻烦的,C++提供了一种较为简单的方法,即使用using声明某个表示符,那么下次使用时这个标识符时不需要说明谁属于谁,但这种使用也是有代价的,即把马甲脱了是会出现名字一样时无法区分的问题,所以脱掉马甲之前一定要确认这个标识符名字是不是唯一的。

namespace veryLongName{
    int a = 10;
    void func(){count << "hello namespace" << endl;}
}
 
    using veryLongName :: a;
    using namespace veryLongName;

using声明 自己的整个命名空间也是可以的,这就是把命名空间中的所用内容都暴露出来了

四。引用

        引用就是指给变量取个别名。是为了节省内存空间,提升程序运行效率。引用的具体做法如下:

1. &别名

2.给哪个变量取别名,就定义哪个变量

3.从上往下整体替换

关于引用,需要注意以下几点:

1.引用必须要初始化,这个一定要注意,所以最终写为 

int &b = a;

2.系统不会为引用开辟空间,内容一样,地址也一样

五。内联函数

        内联函数就是定义的时候用inline修饰的函数。注意的是不能在申明的时候使用inline。用内联的好处是避免了函数调用出的开销,因为在编译阶段,会用函数实际内容替换掉函数体,这个过程中避免了函数调用时的开销。

         需要注意的是,对于我们写代码而言,编写内联函数我们只是加上一个关键字inline,在调用时候也都是系统完成的,我们是感受不到区别的,但类中的成员函数,默认都是内联函数(不加inline修饰也是内联函数),有时候就算函数加上inline修饰,它也不一定就是内联函数,因为内联函数不能存在任何形式的循环语句,不能存在过多的条件判断语句,函数体不能过于庞大,不能对函数去地址等等。有时候不加inline修饰的函数也有可能是内联函数。内不内联是由编译器决定的。所以我们加inline关键字只是一个建议,仅此而已。

六。函数重载

        同一函数在不同场景具有不同含义就叫函数重载。使名字使用方便,是任何程序设计语言的一个重要特征。同一作用域下,函数的参数、个数、顺序不同都可以重载(返回值类型不能作为函数重载的条件)。     

七。函数的默认参数

        函数的默认参数指给函数形参一个默认值。C++在声明函数原型时可以为一个或多个参数指定默认参数,当函数调用时如果没有指定值,编译器会自动用默认值代替,给函数形参设置默认参数时,该形参的右边形参必须都一起设置默认参数,如果还有形参的话。默认参数和函数重载同时出现一定要注意二义性,如下面这段代码:

 八。占位参数

        有类型没有名称叫占位参数。C++在声明时,可以设置占位参数。占位参数只有参数类型,而没有参数名。一般情况下,在函数体内无法使用占位参数,但占位参数也是参数,必须传参。

 九。extern "C"

        我们在写C++的时候有可能这个C++工程需要包含C语言的代码,比如调用C语言的某个模块,而C++与C的编译方式是不一样的,会导致编译后生成的函数名不同,因此此时写的C++代码就应该用C语言去编译,这样编译出来的函数名能在C模块中找到。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值