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. .NET Standard SDK 样式项目中的目标框架

    系列目录     [已更新最新开发文章,点击查看详细] 包表示形式 .NET Standard 引用程序集的主要分发载体是 NuGet 包. 实现会以适用于每个 .NET 实现的各种方式提供. NuG ...

  2. Python日志采集(详细)

    通常在前期调试代码的时候,我们会使用print在IDE控制台打印一些信息,判断运行情况.但在运行整个自动化测试项目的过程中,通过print打印信息的方式获取运行情况显然行不通. 这时就需要收集日志,每 ...

  3. Spring Boot 系列:日志动态配置详解

    世界上最快的捷径,就是脚踏实地,本文已收录架构技术专栏关注这个喜欢分享的地方. 开源项目: 分布式监控(Gitee GVP最有价值开源项目 ):https://gitee.com/sanjianket ...

  4. go 协程阻塞

    func main() { wg.Add(2) go test1() go test2() wg.Wait() } func test1() { defer wg.Done() for i:=0;i& ...

  5. beego和gin对比

    一.对mvc的支持 beego支持完整的mvc M:Model,beego orm,把数据库数据变成object 特性 支持go的所有类型存储 更简洁的curd风格 完整实现了健壮的ORM 支持的数据 ...

  6. Window Mysql 解压安装

    下载MySQL zip文件 解压后没有data文件夹和my.ini文件, 在根目录下创建my.ini文件,输入如下内容 以管理员身份运行cmd ,进入bin目录 ,运行下列命令,即可. a) mysq ...

  7. TCMalloc 内存分配原理简析

    一.TCMalloc TCMalloc简介 为啥要介绍 TCMalloc? 因为golang的内存分配算法绝大部分都是来自 TCMalloc,golang只改动了其中的一小部分.所以要理解golang ...

  8. OpenCV(c++)-1 安装和配置OpenCV4.4(Windows+visual studio 2019)

    @ 目录 安装OpenCV4 在Windows系统安装OpenCV4 配置visual studio 2019 配置包含路径 验证配置结果 安装OpenCV4 OpenCV是一个基于BSD许可(开源) ...

  9. Linux常用系统文件目录结构

    Linux常用系统文件目录结构 bin:全称binary,含义是二进制.该目录中存储的都是一些二进制文件,文件都是可以被运行的. dev:该目录主要存放的是外接设备,例如硬盘.其他的光盘等.在其中的外 ...

  10. STM32入门系列-STM32外设地址映射

    片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1挂载低速外设,APB2和AHB挂载高速外设.相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外 ...