C++在C语言基础之上增强的几个实用特性总结

 更新时间:2016年03月14日 14:30:47   作者:YoferZhang  
这篇文章主要介绍了C++在C语言基础之上增强的几个实用特性总结,包括C++中更强的类型约束以及结构体方面等一些更加高级的特性,需要的朋友可以参考下

变量的定义

C语言中的变量都必须在作用域开始的位置定义!!  C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。 

#include <iostream> 
using namespace std; 
 
int main11() 
{ 
  int i = 0; 
 
  printf("ddd"); 
  int k; // 这段代码在vc6,C语言编译情况下就会报错。就是因为这里的定义 
  system("pause"); 
  return 0; 
} 


对C语言register的增强

register关键字 请求编译器让变量a直接放在寄存器里面,速度快
在c语言中 register修饰的变量 不能取地址,但是在c++里面做了内容:

1.register关键字的变化
register关键字请求“编译器”将局部变量存储于寄存器中,C语言中无法取得register变量地址,在C++中依然register关键字,C++编译器有自己的优化方式,不使用register也可能做优化,C++中可以取得register变量的地址。

2.C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。

3.早期C语言编译器不会对代码进行优化,因此register变量是一个很好的补充。
demo

#include <iostream> 
 
int main() 
{ 
  register int a = 0; 
 
  printf("&a = %x\n", &a); // c语言这里会报错 
 
  for (int i = 1; i < 1000; i++) { // 而对于这种频繁使用i的情况自动进行优化,将i放入寄存器中 
    printf("%d\n", i); 
  } 
 
  system("pause"); 
  return 0; 
} 


对C语言的变量检测增强

在C语言中,重复定义多个同名的全局变量是合法的;在C++中,不允许定义多个同名的全局变量。
C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上。
demo

#include <stdio.h> 
int g_var; 
int g_var = 1; 
// C语言可以编译通过 
// C++直接拒绝这种二义性 
int main(int argc, char *argv[]) 
{ 
  printf("g_var = %d\n", g_var); 
  return 0; 
} 


struct类型增强

C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型。
C++中的struct是一个新类型的定义声明。
demo

struct Student 
{ 
  char name[100]; 
  int age; 
}; 
 
int main(int argc, char *argv[]) 
{ 
  // C语言中需要在定义结构体的时候加struct,而C++不需要 
  Student s1 = { "wang", 1 }; 
  Student s2 = { "wang2", 2 }; 
  return 0; 
} 

C++中所有的变量和函数都必须有类型

C语言中的默认类型在C++中是不合法的,比如说函数f的返回值是什么类型,参数又是什么类型? 函数g可以接受多少个参数?
更换成.cpp就会报错  
 

f(i) 
{ 
  printf("i = %d\n", i); 
 
} 
 
g() 
{ 
  return 5; 
} 
 
int main(int argc, char *argv[]) 
{ 
 
  f(10); 
 
  printf("g() = %d\n", g(1, 2, 3, 4, 5)); 

  getchar();  
  return 0; 
} 


三目运算符的增强

在C语言中表达式的结果放在寄存器中,在C语言中,表达式的返回值是变量的值,在C++中,表达式返回的是变量的本身。

int main(){int a = 10;int b = 20;// 返回一个最小数,并且给最小数赋值成3

三目运算符是一个表达式,表达式不可能做左值,所以这个在C语言中无法编译通过

(a < b ? a : b) = 30;

而在C++中就可以编译运行。C语言中也可以实现相同的功能:

(a < b ? &a : &b) = 30;return 0;} 

C++中const加强

C语言中的const是一个冒牌货。

int main() 
{ 
  // 好像a是一个常量 
  const int a = 10; 
  int *p = NULL; 
  p = (int *)&a; 
  *p = 20; // 间接赋值 
 
  printf("a:%d\n", a); 
  // C语言中显示a被修改了 
  // C++则显示a还是10,没有改变 
 
  return 0; 
} 

C++中的const是一个真正的常量。
解释:
C++编译器对const常量的处理。
当碰见常量声明时,在符号表中放入常量。
编译过程中若发现使用常量则直接以符号表中的值替换。
编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(兼容C)。

相关文章

  • C++序列操作函数学习最全指南

    C++序列操作函数学习最全指南

    这篇文章主要给大家介绍了关于C++序列操作函数学习的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • C语言多种方法实现一个函数左旋字符串中K个字符

    C语言多种方法实现一个函数左旋字符串中K个字符

    这篇文章主要为大家介绍了C语言多种方法实现一个函数,可以左旋字符串中K个字符,文中附含详细的示例讲解,有需要的朋友可以借鉴参考下
    2021-10-10
  • 详解设计模式中的模板方法模式及在C++中的使用

    详解设计模式中的模板方法模式及在C++中的使用

    这篇文章主要介绍了设计模式中的模板方法模式及在C++中的使用,模板方法将逻辑封装到一个类中,并采取组合(委托)的方式解决这个问题,需要的朋友可以参考下
    2016-03-03
  • C++中std::distance使用方法示例

    C++中std::distance使用方法示例

    std::distance 是 C++ 标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • 通过代码实例解析c++ vector常用方法

    通过代码实例解析c++ vector常用方法

    这篇文章主要介绍了通过代码实例解析c++ vector常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • C++ 超全面讲解多态

    C++ 超全面讲解多态

    这篇文章主要介绍了C++多态的原理与实现,多态是一种面向对象的设计思路,本身和C++不是强绑定的,其他语言当中一样有多态,只不过实现的方式可能有所不同。下面来一起了解更多详细内容吧
    2022-04-04
  • Qt利用tablewidget模拟手指实现滑动

    Qt利用tablewidget模拟手指实现滑动

    这篇文章主要为大家详细介绍了Qt如何利用tablewidget模拟手指实现滑动效果,文中的示例代码讲解详细,对我们学习Qt有一定的帮助,需要的可以参考一下
    2023-01-01
  • C++ EasyX学习之鼠标操作详解

    C++ EasyX学习之鼠标操作详解

    EasyX是针对C/C++的图形库,可以帮助使用C/C++语言的程序员快速上手图形和游戏编程。本文将为大家详细讲讲EasyX的鼠标操作,需要的可以参考一下
    2022-07-07
  • Cocos2d-x Schedule定时器的使用实例

    Cocos2d-x Schedule定时器的使用实例

    这篇文章主要介绍了Cocos2d-x Schedule定时器的使用实例,本文的讲解内容包含在代码注释中,需要的朋友可以参考下
    2014-09-09
  • C语言 野指针与空指针专篇解读

    C语言 野指针与空指针专篇解读

    全网最接地气的C语言野指针介绍,此处对于野指针与空指针知识点做一些简要的介绍,作者实属初学,写博客也是作者学习的一个过程,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,希望大家多多给予支持,赠人玫瑰,手有余香
    2021-11-11

最新评论