• 命名空间
  • register
在C语言横行的时代,为了加快运行速度,一些关键变量会被放入寄存器中,程序代码请求编译器把变量存入寄存器,然而C语言版的寄存器变量无法通过地址获得register变量。
c++仍然支持关键字register
#include "iostream"
#include<string>
using namespace std;
void main()
{
for (int i = ; i < ; i++)
{
printf("%d\n", i);//这种情况下就会把i放入寄存器,因为i被频繁使用
}
system("pause");
}
#include "iostream"
#include<string>
using namespace std;
void main()
{
register string a = "陈培昌";
printf("变量地址为%d\n", &a);
system("pause");
}

输出结果:

  • 变量检测的增强
#include "iostream"
#include<string>
using namespace std;
void main()
{
string a;
string a = "陈培昌";
printf("教练姓名%s\n", a);
system("pause");
}

所谓变量检测的增强就是c++不允许重复声明变量,而C可以(不过windows下vs2013报错,因为c/c++一直在避免这种二义性)

  • struct增强

C语言中,struct结构是一组变量的集合,不认为它是一种新的类型,说的通俗点

#include<stdio.h>
struct mycoach
{
char name[];
int age;
}; void main()
{
struct mycoach cpc;//不加struct关键字报错
}

C++中

struct mycoach
{
string name;
int age;
};
void main()
{
mycoach cpc;//居然可以
system("pause");
}

一些情况下,struct跟类有异曲同工之妙

#include "iostream"
#include<string>
using namespace std;
struct mycoach
{
public:
string name;
int age;
private:
string favorite;
};
void main()
{
mycoach cpc;
system("pause");
}
  • c++对数据类型的检查更严格(无论变量还是函数都需声明数据类型)
  • 新增了数据类型bool
#include "iostream"
#include<string>
using namespace std; void main()
{
bool w=true;
printf("布尔变量长度%d\n", sizeof(w));
w = -;
printf("布尔值为%d\n", w);
w = ;
printf("布尔值为%d\n", w);
w = ;
printf("布尔值为%d\n", w);
system("pause");
}

如果多个布尔值同时声明,可能占用一个bit,取决于编译器的实现

bool b2,b3,b4;

  • 三目运算符的增强
C语言中,表达式的返回值放到了CPU寄存器里面,是一个值(数),而c++返回的是变量的本身

c++

void main()
{
int a = ;
int b = ;
(a < b ? a : b) = ;//相当于执行b=30;
printf("值b为:%d\n", b);
system("pause");
}

然而c语言中

究其原因是C语言返回了b的值,所以(a<b?a:b)=30最后执行的命令是10=30;这样一来操作就变得毫无意义;据说这个例子是说明C和c++编译器不同的有力案例

c++如何做到的?看来是返回了地址......,所以c语言的代码不妨修改如下:

#include<stdio.h>

void main()
{
int a = ;
int b = ;
*(a < b?&a :&b) = ;
printf("值b为:%d\n", b);
system("pause");
}

输出结果:

  • const用法
#include<iostream>
using namespace std;
struct mycoach
{
string name;
int age;
}; int opcoach01(mycoach* const pt)
{
//指针变量本身不能被修改
pt->name = "陈培昌";
pt = NULL;
} int opcoach02(const mycoach *pt)
{
//指针指向的内存空间不能被修改
pt->name = "陈培昌";
}

输出结果:

#include<stdio.h>

void main()
{
const int a = ;
a = ;
printf("值a为:%d\n", a);
system("pause");
}

输出结果:

然而:

#include<stdio.h>

void main()
{
const int a = ;
int *p = NULL;
p =&a;
*p = ;
printf("值a为:%d\n", a);
getchar();
}

这样一来:

因此在c语言中const是个伪常量;而c++无法这样修改,因为c++编译器扫描到const类型时,并不像c语言那样为其分配内存,而是放入符号表(一种键值对类型的数据结构)

有别于C语言内存四区

c++编译器扫描到对常量取地址操作时,为常量分配内存空间
或者const变量作为一种全局变量使用时,也会分配内存空间

c++ const类型实现机制

取值时,从符号表里读取a对应的变量

执行 p=int(*)&a操作时,另开辟了一块空间,让整型指针p指向这块空间的地址

下列代码证实p指向的空间存在

#include<iostream>
using namespace std;
void main()
{
const int a = ;
int *p = NULL;
p = (int*)&a;
*p = ;
printf("a的值依旧是:%d\n",a);
cout << "p指向的空间真实存在,其内存地址是" << p << "值是:" << *p<<endl;
system("pause");
}

输出结果:

C++比起C来新增的拓展的更多相关文章

  1. es6入门6--数组拓展运算符,Array.from()基本用法

    本文只是作为ES6入门第九章学习笔记,在整理知识点的同时,会加入部分个人思考与解答,若想知道更详细的介绍,还请阅读阮一峰大神的ES6入门 一.拓展运算符 ES6中新增了拓展运算(...)三个点,它的作 ...

  2. Spring版本功能变更&Spring4.x的新特性

    有朋友想知道Spring不同版本都有哪些功能变更,说直接在百度搜索找到的结果都不是想要的,其实还是关键词不对,找Spring不同版本的新特性就能获得更好的结果.其实在Spring工程github的wi ...

  3. 智能可视化搭建系统 Atom 服务架构演变

    作者:凹凸曼 - Manjiz Atom 是什么?Atom 是集结业内各色资深电商行业设计师,提供一站式专业智能页面和小程序设计服务的平台.经过 2 年紧凑迭代,项目越来越庞大,需求不断变更优化,内部 ...

  4. python-闭包和装饰器-02-装饰器(decorator)

    装饰器(decorator) 理解了上一章的闭包之后,装饰器就是闭包的一种应用,只是外部函数的参数传入的不是普通的变量类型,而是传入一个函数名.装饰器一般用于:不修改被装饰函数(即外部函数传入的参数) ...

  5. iOS APP 新增表情包拓展

    图示教程如下:

  6. django用户认证系统——拓展 User 模型

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  7. django用户认证系统——拓展 User 模型2

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  8. 深入理解javascript选择器API系列第三篇——h5新增的3种selector方法

    × 目录 [1]方法 [2]非实时 [3]缺陷 前面的话 尽管DOM作为API已经非常完善了,但是为了实现更多的功能,DOM仍然进行了扩展,其中一个重要的扩展就是对选择器API的扩展.人们对jQuer ...

  9. [CG编程] 基本光照模型的实现与拓展以及常见光照模型解析

    0.前言 这篇文章写于去年的暑假.大二的假期时间多,小组便开发一个手机游戏的项目,开发过程中忙里偷闲地了解了Unity的shader编写,而CG又与shaderLab相似,所以又阅读了<CG教程 ...

随机推荐

  1. C++类的介绍

    最近在学习SLAM,顺便将C++类的知识复习一下.(其中部分官方定义和程序设计方法来源于西北工业大学魏英老师)   1.类的定义: 是用户自定义的数据类型. C++一个类定义的形式如下: class ...

  2. centos6安装Python3环境

    Python3安装 CentOS 6+系统默认安装的python版本是2.6.6,python2版本与python3还有有一些语法上的不一样.我们要把python升级到3版本,但是系统自带的旧版本py ...

  3. Python测试框架对比

    如有任何学习问题,可以添加作者微信:lockingfree 更多学习资料请加QQ群: 822601020获取 unittest, pytest, nose, robot framework对比 什么是 ...

  4. 为什么会选择redis数据库?

    因为redis支持主从同步,而且数据都是缓存在内存中,所以基于redis的分布式爬虫,对请求和数据的高频读取效率非常高

  5. Java中使用md5进行hash运算

    public class Md5Util { /** * @author Bean_bag * @description 进行Hash运算 * * @param input 参数字符串 * @retu ...

  6. 小程序开发--WePy框架

    现如今mvvm框架如此火热,其核心思想即js逻辑层不直接操作DOM,只改变组件状态:而视图层则通过模板template进行渲染. 1.WePy项目的目录结构 ├── dist 小程序运行代码目录 ├─ ...

  7. 搭建docusaurus博客

    搭建docusaurus博客: docusaurus是facebook的开源的用于简化构建,部署,和维护的博客网站. 特点: 快速启动 支持本地化 页面可自定义 安装要求: Node >= 8. ...

  8. zookpeer 和 redis 集群内一致性协议 及 选举 对比

    zookeeper 使用的是zab协议,类似 raft 的 Strong Leader 模式 redis 的哨兵 在  崩溃选举的时候采用的是 raft的那一套term. 因为redis 采用的是异步 ...

  9. 【caffe编译】nvcc warning:The 'compute_20', 'sm_20'

    Makefile.config 中 CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \ -gencode arch=compute_20,code=s ...

  10. Facebook开源时间序列内存数据库Beringei,追求极致压缩率——如果是int根据大多数时间序列中的值与相邻数据点相比并没有显著的变化,只要使用XOR将当前值与先前值进行比较,然后存储发生变化的比特。最终,该算法将整个数据集至少压缩了90%

    转自:http://www.infoq.com/cn/news/2017/02/Facebook-Beringei 2017年2月3日,Facebook宣布将开源他们的高性能时序数据存储引擎Berin ...