1 namespace 命名空间

1.1 C++ 命名空间的定义

C++标准 引入了关键字 namespace(命名空间),可以更好地控制标识符的作用域。

namespace name
{
...
}

1.2 C++ 命名空间的使用方法

std 是 C++标准命名空间,C++标准程序库中的所有标识符都被定义在 std 中,比如标准库中的类 iostream、vector 等,使用时要加上 using 声明(using namespace stdusing 指示(std::string、std::vector<int>

  • 使用整个命名空间:using namespace name;

  • 使用命名空间中的变量:using name::variable;

  • 使用默认命名空间中的变量:::variable

1.3 头文件 <iostream> 和 <iostream.h> 的区别

<iostream> 和 <iostream.h> 两者是两个文件,里面的代码也不一样。早期的 C++ 实现将标准库功能定义在全局空间里,声明在 <iostream.h> 中。

C++ 标准为了和 C 区别开来,也为了正确使用命名空间,规定头文件不使用后缀.h。因此,

  1. 当使用 <iostream.h> 时,相当于在 C 中调用标准库函数,使用的是全局命名空间,也就是早期的 C++ 实现。

  2. 当使用 <iostream> 时,该头文件没有定义全局命名空间,必须使用 namespace std,才能正确的使用标准库函数如 cout。

1.4 C 和 C++ 中的命名空间的区别

C 中的命名空间

  • 在 C 语言中只有一个全局作用域

  • C 语言中所有的全局标识符共享同一个作用域

  • 标识符之间可能发生冲突

C++ 中的命名空间

  • 命名空间将全局作用域分成不同的部分

  • 不同命名空间中的标识符可以同名而不会发生冲突

  • 命名空间可以相互嵌套

  • 全局作用域也叫默认命名空间

1.5 C++ 命名空间编程实践

// naspaceTest.cpp,本代码验证 namespace 作用域
// C 语言头文件,C++ 兼容 C 语言
#include<stdio.h> namespace namespaceA
{
int variable = 0;
} namespace namespaceB
{
int variable = 1; namespace namespaceC
{
int variable; struct infoStruct
{
char name[10];
int age;
};
}
} int main(void)
{
using namespace namespaceA; printf("namespaceA variable = %d\n",variable); //0 printf("namespaceB variable = %d\n",namespaceB::variable); //1 namespaceB::namespaceC::variable = 2; printf("namespaceC variable = %d\n",namespaceB::namespaceC::variable); //2 namespaceB::namespaceC::infoStruct info = {"Pika",16}; printf("namespaceC.info.name = %s\n",info.name); //Pika
printf("namespaceC.info.age = %d\n",info.age); //16 getchar(); return 0;
}

运行结果:

2 变量定义位置

C 语言:在较老的 C89/C90 标准(ANSI C标准)下,变量只能在程序的开头定义,或者说变量定义的前面不能有其他非声明或非定义的语句。

比如在 VC++6.0 或者 VS2010 下编译以下代码时:

// varDefTest.c,本代码验证在较老的 C89/C90 标准(ANSI C标准)下,变量定义位置
# include <stdio.h>
int main(void)
{
int i;
i = 1;
int j = 2; //这句是错误的,因为在它前面有一个给变量 i 赋值的非定义语句
return 0;
}

会提示下面的错误:

error C2143: 语法错误 : 缺少“;”(在“类型”的前面)

但是这种写法在 .cpp 文件(C++ 源文件)中是允许的,C++ 允许在程序的任意位置定义变量

3 全局变量重复定义检测

在 C 语言中,允许重复定义多个同名的全局变量,多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上,即全局变量会取最后一个被赋予的值,如下所示:

// globalValTest.c,本代码验证在 C 语言中,允许重复定义多个同名的全局变量
#include <stdio.h> int global_val; int global_val = 1; int main()
{
printf("global_val = %d\n",global_val); return 0;
}

运行结果:

C++ 中不允许定义多个同名的全局变量,如下所示:

// globalValTest.cpp,本代码验证在 C++ 中不允许定义多个同名的全局变量
#include <iostream> using namespace std; int global_val;
int global_val = 1; int main(int argc, char *argv[])
{
cout << "global_val = " << global_val << endl; return 0;
}

运行结果:

4 struct 类型

C 中的 struct 只能是一些变量的集合体,可以封装数据却不可以隐藏数据,而且成员不可以是函数。

C++ 中的 struct 可以当作 class 来用,在标准 C++ 中,struct 和 class 有两个区别:

  1. struct中的成员默认是 public 的,class 中的默认是 private 的。

  2. 在用模版的时候只能写 template 或 template 不能写 template 。

此外,如果没有多态和虚拟继承,在 C++ 中,struct 和 class 的存取效率完全相同。

如果不是为了和 C 兼容,C++ 中就不会有 struct 关键字。因此建议是:如果不需要与C兼容或传递参数给C程序,不要在 C++ 中用 struct

5 C++ 相较 C 更加强类型,任意位置的程序元素都必须显式指明类型

C 语言中,默认类型包括以下情况:

  • 如果没有明确写出函数返回类型,函数返回类型默认为 int 类型。

    例:function(int arg); ,表示返回值为 int ,接受一个 int 类型参数的函数。

  • 如果没有明确写出函数参数类型,函数参数默认为 int 类型。

    例:int function(arg); ,表示返回值为 int ,接受一个 int 类型参数的函数。

  • 如果没有明确写出函数参数,则该函数可以接受任意参数。

    例:int function(); ,表示返回值为 int,接受任意参数的函数。

C 语言中的默认类型在 C++ 中是不合法的。

在 C++ 中,int function();int function(void) 具有相同的意义,都表示返回值为 int 的无参函数。

6 新增 bool 类型关键字

C++ 在 C 语言的基本类型上增加了 bool 类型,bool 类型只有 true(非0),false(0)两个值。

7 三目运算符功能增强

C 语言中的三目运算符返回的是变量的值,不能作为左值使用。

C++ 中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方。

但三目运算符可能返回的值中如果有一个是常量,则不能作为左值使用,如:(a<b?1:b) = 30;

8 const 增强

8.1 C++ const关键字小结

const 关键字用来定义常量。

常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。

8.1.1 const 修饰普通类型的变量

const int CONST_A = 1;      // 常整型数 CONST_A

int const CONST_B = 2;      // 常整型数 CONST_B

int c = CONST_A;            // 正确

CONST_A =  3;               // 编译器会报错,给常量赋值是不被允许的

可以将 常整型数 CONST_A 赋值给 整型变量 c,但是不能给 常整型数 CONST_A 再次赋值。对一个常量赋值是不被允许的,常量的值不允许修改。

8.1.2 const 修饰指针变量

const int *CONST_P_C = 1;     // CONST_P_C是一个指向常整型数的指针(它所指向的内容不能被修改,但是指针指向的内存地址可以修改)

int test = 61;

*CONST_P_C = 0;      // 编译器不允许,报错

CONST_P_C = &test;   // 正确

int* const CONST_P_D = 2;     // CONST_P_D是一个常指针(指针指向的内存地址不能被修改,但是它所指向的内容可以被修改)

*CONST_P_C = 0;      // 正确

CONST_P_C = &test;   // 编译器不允许,报错

const int * const CONST_P_E = &test;   // CONST_P_E是一个指向常整型数的常指针(指针指向的内存地址和她所指向的内容,均不能被修改)

8.2 const 和 #define 的区别

const 常量是由编译器处理的,提供类型检查和作用域检查。

#define由预处理器处理,单纯的文本替换。

8.3 C 语言和 C++ 中的 const 区别

8.3.1 C 语言中的 const 变量

C 语言中的 const 变量是只读变量,有自己的存储空间

8.3.2 C++ 中的 const常量

  • 可能分配存储空间,也可能不分配存储空间

  • 当 const 常量为全局时,并且需要在其他文件中使用,会分配存储空间

  • 当需要使用 & 操作符,取 const 常量的地址时,会分配存储空间

  • const int &a = 10; ,即 const 修饰引用时,也会分配存储空间

9 对 enum 枚举的检测增强

C 语言中枚举的本质就是 int,枚举变量可以用任意 int 赋值。但 C++ 中,只能用被枚举出来的元素赋值,如下所示:

// enumTest.cpp,本代码验证 枚举

#include <iostream>
using namespace std; enum sex{girl,boy}; int main()
{
enum sex testSex = girl; testSex = 0; // 错误,但是 C 语言能通过 testSex = boy; cout << "testSex = " << testSex << endl; // 1 return 0;
}

C++ 基础 1:C++ 对 C 语言的增强的更多相关文章

  1. 【个人笔记】002-PHP基础-01-PHP快速入门-02-PHP语言相关介绍输

    002-PHP基础-01-PHP快速入门 02-PHP语言相关介绍 1.PHP是什么 Hypertext Preprocessor超文本预处理器 是一种通用开源脚本语言 Personal Home P ...

  2. 01 C语言程序设计--01 C语言基础--第1章 C语言概述&第2章 GCC和GDB

    走进嵌入式开发的世界,企业级项目课程让你达到企业嵌入式应用开发要求.名师在线答疑,解决疑难.科学评测体系,系统评估学习.核心项目实........ 30 门课程 241小时12分钟 824 人学习 学 ...

  3. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情7. 安装 PHP PHP 是用于 web 基础服务的服务器端脚本语言。它也经常被用作通用编程语言。在最小化安装的 CentOS 中安

    CentOS 是一个工业标准的 Linux 发行版,是红帽企业版 Linux 的衍生版本.你安装完后马上就可以使用,但是为了更好地使用你的系统,你需要进行一些升级.安装新的软件包.配置特定服务和应用程 ...

  4. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  5. java基础学习总结一(java语言发展历史、jdk的下载安装以及配置环境变量)

    最近一段时间计划复习一下java基础知识,使用的视频课程是尚学堂高淇老师的,上课过程中的心得体会直接总结一下,方便以后复习. 一:计算机语言的发展 1:机器语言,最原始的语言,主要有“01”构成,最早 ...

  6. 零基础数据分析与挖掘R语言实战课程(R语言)

    随着大数据在各行业的落地生根和蓬勃发展,能从数据中挖金子的数据分析人员越来越宝贝,于是很多的程序员都想转行到数据分析, 挖掘技术哪家强?当然是R语言了,R语言的火热程度,从TIOBE上编程语言排名情况 ...

  7. Java基础笔记(1)----语言基础

    变量 变量:是内存中的一块存储空间,是存储数据的基本单元. 使用:先声明,后赋值,在使用. 声明:数据类型 + 变量名 = 值.(例:int a = 5:) 数据类型 分类:如图: 详解: Strin ...

  8. 零基础学Python--------第2章 Python语言基础

    第2章  Python语言基础 2.1 Python语法特点 2.11注释 在Python中,通常包括3种类型的注释,分别是单行注释.多行注释和中文编码声明注释. 1.单行注释 在Python中,使用 ...

  9. 【转】Linux基础与Linux下C语言编程基础

    原文:https://www.cnblogs.com/huyufeng/p/4841232.html ------------------------------------------------- ...

  10. C基础入门 - 第一章 - C语言绪言

    第1章 C语言绪言 1.1 C语言概述 1.1.1 C语言世界 1.1.2 C语言学习, 能当饭吃吗 1.2 开发环境构建 1.2.1 visual studio安装使用 1.2.2 visual s ...

随机推荐

  1. Pock 把 Touch Bar 变成系统中的 Dock 栏

    Pock 把 Touch Bar 变成系统中的 Dock 栏 Pock 是一款 macOS App,你可以通过它把 Touch Bar 变成系统中的 Dock 栏,直接用来切换和启动 App,尽享全屏 ...

  2. RHSA-2018:0007-重要: 内核 安全更新(需要重启、存在EXP)

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

  3. C#开启线程的四种方式

    如果需要查看更多文章,请微信搜索公众号 csharp编程大全,需要进C#交流群群请加微信z438679770,备注进群, 我邀请你进群! ! ! 1.异步委托开启线程 public class Pro ...

  4. JVM性能调优(3) —— 内存分配和垃圾回收调优

    前序文章: JVM性能调优(1) -- JVM内存模型和类加载运行机制 JVM性能调优(2) -- 垃圾回收器和回收策略 一.内存调优的目标 新生代的垃圾回收是比较简单的,Eden区满了无法分配新对象 ...

  5. shell-变量的数值运算与特殊应用expr

    1. expr(evaluate expressions)命令的用法: expr命令一般用于整数值,当也可用于字符串,用来求表达式变量的值,同时expr也是一个手工命令行计算器. 语法:expr ex ...

  6. Kafka单机安装

    一.Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的 分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作 ...

  7. IdentityServer 3.1.x 迁移到 4.x

    一.前言 IdentityServer4 4.x已经正式发布了,根据官方的 Release Note,3.1.x 到 4.x 的变更也是非常多,今天在将代码迁移到 4.x 遇到了一些问题在此记录下来, ...

  8. element中过滤器filters的使用(开发小记)

    之前在开发过程中遇到这么一个问题,一串数据需要在el-table中展示,其中含有金额字段,需要将其转换成标准数据格式,即三位一个逗号间隔. 今年刚毕业就上手项目了,第一次接触的Vue,开发经验少,也忘 ...

  9. java 图片相似度算法

     利用直方图原理实现图像内容相似度比较  ,作为笔记记录在随笔中.   public class PhotoDigest {     public static void main(String[]  ...

  10. day39 Pyhton 并发编程02

    一.内容回顾 并发和并行的区别 并发 宏观上是在同时运行的 微观上是一个一个顺序执行 同一时刻只有一个cpu在工作 并行 微观上就是同时执行的 同一时刻不止有一个cpu在工作 什么是进程 一个运行中的 ...