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. 搭建zabbix+grafana监控

    编写一件安装脚本 #!/bin/sh echo "\033[32;1m脚本作者:fage\033[0m" #sleep 10 zabbix_version=4.0.2 zabbix ...

  2. [HAOI 2017]八纵八横

    线段树分治+线形基. 线段树分治是个锤子?? 以时间轴构建线段树,把每个环以"对线段树产生影响的时间区间"的形式加入线段树即可. #include<bits/stdc++.h ...

  3. 零基础小白Python入门必看:面向对象之典型魔术方法

  4. Java虚拟机诊断利器

    Java虚拟机诊断利器  

  5. ubuntu 19.10 中防火墙iptables配置

    $sudo which iptables   /usr/sbin/iptables说明有安装 如果没有安装,那么使用sudo apt-get install iptables 安装. 刚装机,是这个样 ...

  6. FreeType2使用总结(转)

    一.FreeType2简介 1. 是一个免费.开源.可移植且高质量的字体引擎: 2. 支持多种字体格式文件,并提供了统一的访问接口: 3. 支持单色位图.反走样位图渲染,这使字体显示质量达到Mac的水 ...

  7. Windows下CertUtil校验和编码文件

    目录 前言 CertUtil计算文件hash 计算MD2 计算MD4 计算MD5 计算SHA1 计算SHA256 计算SHA384 计算SHA512 文件base64编码 文件base64解码 文件h ...

  8. 【博弈论】51Nod 1534 棋子游戏

    题目内容 波雷卡普和瓦西里喜欢简单的逻辑游戏.今天他们玩了一个游戏,这个游戏在一个很大的棋盘上进行,他们每个人有一个棋子.他们轮流移动自己的棋子,波雷卡普先开始.每一步移动中,波雷卡普可以将他的棋子从 ...

  9. 学习ing

    1.从硬件和逻辑两个角度探讨什么是内存?硬件上看,内存就是电脑上的硬件--内存条.内存通过内存条不同的实现原谅分为DRAM(DRAM已经发展出好多代)和SRAM.从逻辑的角度来说,内存就是一个可以随机 ...

  10. D - 活动选择

    Description 学校的大学生艺术中心周日将面向全校各个学院的学生社团开放,但活动中心同时只能供一个社团活动使用,并且每一个社团活动开始后都不能中断.现在各个社团都提交了他们使用该中心的活动计划 ...