1、c++对c语言的扩展

1.类型增强

检查更加严格

  • 比如,把一个 const 类型的指针赋给非 const 类型的指针。c 语言中可以通的过,但是在 c++中则编不过去
    const int a = 100;
      int b = a;
      const int *pa = &a;
      int *pb = pa;

增加bool类型

  • c语言中使用0和!0来表示逻辑的真假,但是在c++中使用bool类型表示逻辑的真(true)假(false);
    bool flag = true;
      bool flag1 = false;
      cout<<"flag = "<<flag<<endl;    //1
      cout<<"flag = "<<flag1<<endl;   //0
      cout<<sizeof(bool);             //1

真正的枚举

  • c 语言中枚举本质就是整型,枚举变量可以用任意整型赋值。而 c++中枚举变量,只能用被枚举出来的元素初始化。
      enum num {one = 3, two, three};
      int a = one;
      cout<< a <<endl;      //3
      cout<< three <<endl;  //5

表达式的值可被赋值

  • c 语言中表达式通常不能作为左值的,即不可被赋值,c++中某些表达式是可以赋值的。
    int a, b, c = 10;
      (a = b) = 20;
      cout<< a << b <<endl;
      (a>c?b:c) = 50;
      cout<< "a = "<< a << " b = " << b << " c = " << c <<endl; // a=20 b=50 c=10

2.输入与输出(cin/cout)

cin && cout

  • cin 和 cout 是 C++的标准输入流和输出流。他们在头文件 iostream 中定义
    cout<<"your name is: "<<name<<endl;
    cout<<"your age is: "<<age<<endl;

格式化

  • 包含于头文件 #include <iomanip> 中
  • 设置域宽及位数:对于实型,cout 默认输出六位有效数据,setprecision(4) 可以设置有效位数,setprecision(n)<<setiosflags(ios::fixed)合用,可以设置小数点右边的位数。
      float i = 1.33333;
      cout<< i <<endl;          //1.33333
      cout<<setw(8)<<i<<endl    //_1.33333
          <<setw(5)<<100<<endl  //__100
          <<setprecision(4)<<setiosflags(ios::fixed)<<i<<endl; //1.3333

按进制输出

  • 按十六进制、十进制、八进制、默认十进制 输出
      //按十六进制、十进制、八进制、默认十进制 输出
      int m = 15;
      cout<< hex << m << endl;        // f
      cout<< dec << m << endl;        // 15
      cout<< oct << m << endl;        // 17
      cout<< setbase(10) << m << endl;// 15

 设置填充符

  • 还可以设置域宽的同时,设置左右对齐及填充字符
    //还可以设置域宽的同时,设置左右对齐及填充字符。
      cout<<setw(10)<<1234<<endl;               //______1234
      cout<<setw(10)<<setfill('0')<<1234<<endl; //0000001234
      cout<<setw(10)<<setfill('0')<<setiosflags(ios::left)<<1234<<endl; //1234000000
      cout<<setw(10)<<setfill('-')<<setiosflags(ios::right)<<1234<<endl;//------1234

3.函数重载(function overload)

 函数重载规则:

  • 函数名相同;
  • 参数的类型,个数, 顺序不同,均可构成函数重载;
  • 返回类型不同则不能构成重载;
    void func(int a); //ok
    void func(char a); //ok
    void func(char a,int b); //ok
    void func(int a, char b); //ok
    char func(int a); //与第一个函数有冲突
    void func(int a)
    {
      cout<< "func(int a)" <<endl;
    }
    void func(int a, char b)
    {
      cout<< "func(int a, char b)" <<endl;
    }
    void func(char b, int a)
    {
      cout<< "func(char b, int a)" <<endl;
    }
    
    int main(void)
    {
      int a; char b;
      func(a);    //func(int a)
      func(a,b);  //func(int a, char b)
      func(b,a);  //func(char b, int a)
      return 0;  
    }

函数匹配原则

  • 严格匹配,找到则调用;
  • 通过隐士转换寻求一个匹配;
    void func(int a)
    {
      cout<< "func(int a)" <<endl;
    }
    void func(double c)
    {
      cout<< "func(double a)" <<endl;
    }
    int main(void)
    {
      func(1);    //func(int a)
      func(2.2);  //func(double a)
      return 0  
    }

重载底层实现

  • c++利用name mangling(倾轧)技术,来改名函数名,区分参数不同的同名函数;
  • 实现原理:用 v-c- i-f- l- d 表示 void char int float long double 及其引用。上例中的函数根据条件的不同,可能被倾轧成如下函数:
      func_i(a);    //func(int a)
      func_f(a,b);  //func(int a, char b)
      func_l(b,a);  //func(char b, int a)

extern "C"

  • 倾轧name mangling 发生在两个阶段,.cpp 编译阶段,和.h 的声明阶段。只有两个阶段同时进行,才能匹配调用。
  • 我们知道C++是能够兼容C的,如果我们有了一个C语言的头文件和其对应的库,在C++中如何使用它呢?在include该头文件的时候当然要加入extern "C",否则按照C++的符号进行符号修饰,那么在库中就会找不到该符号了。
  • 使用extern “C”, 告诉编译器按照c语言的规则进行编译。

4.操作符重载(operator overload)

 

5.默认参数

 

6.引用

 

7.内存管理(new/delete operation)

 new/delete 与 malloc/free的区别:

  • malloc/free属于c库函数,new/delete属于c++关键字;

申请单变量

申请多维数组

8.内联函数(inline function)

 

9.类型增强

 

10.命名空间(namespace)

 " :: ":作用域运算符

11.系统string类

 

 

12.一些建议

 

转载于:https://www.cnblogs.com/icefree/p/8610404.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值