C++回顾(一)——从C到C++

news2024/9/25 21:28:20

前言

在学习了C语言的基础上,C++到底和C有什么区别呢?

1.1 第一个C++程序

#include <iostream>

// 使用名为std的命名空间
using namespace std;

int main()
{
    // printf ("hello world\n");
    // cout 标准输出  往屏幕打印内容  相当于C语言的 printf
    // << 左移操作符,在这里它的功能被改造,代表数据流向
    // << 代表数据从右端移到左端 右端是 "hello world"字符串,左端是 cout 标准输出
    // 所以 cout << "hello world" 代表将内容打印到标准输出
    // endl 代表换行,相当于 C语言的 '\n'
    // << 操作符可以连着使用
    cout << "Hello World!" << endl;

    return 0;
}

运行结果:
在这里插入图片描述

1.2 命名空间

1.2.1 为什么引入命名空间

  • 命名空间将全局作用域分成不同的部分
  • 不同命名空间中的标识符可以同名而不会发生冲突
  • 命名空间可以相互嵌套
  • 全局作用域也叫默认命名空间

1.2.2 怎么使用命名空间

(1)命名空间的定义

namespace 是C++中的关键字,用来定义一个命名空间,语法格式为:

namespace name {
    变量
    函数
    类
}

name是命名空间的名字,它里面可以包含变量、函数、类、typedef、#define 等,最后由{ }包围

例如:
定义一个命名空间,名字叫NameSpaceA

namespace NameSpaceA
{
    int a = 0;
}

命名空间的定义可以嵌套,例如:

namespace NameSpaceB
{
    int a = 1;
 
    namespace NameSpaceC
    {
        struct Teacher
        {
            char name[10];
            int age;
        };
    }
}

(2)命名空间的使用

  • 使用域解析符 ::
    ::是一个新符号,称为域解析操作符,在C++中用来指明要使用的命名空间。
NameSpaceA::a = 10;   // 使用命名空间 NameSpaceA中的变量a
NameSpaceB::a = 20;   // 使用命名空间 NameSpaceB中的变量a
 
printf ("%d, %d\n", NameSpaceA::a, NameSpaceB::a);

使用命名空间B中的命名空间C中的结构体 Teacher

NameSpaceB::NameSpaceC::Teacher t2 = {"xiaoming", 20};
  • 使用using声明
    在这里用using声明了 NameSpaceA::a, 它的意思是在声明以后的程序中如果出现未指明命名空间的a,就使用NameSpaceA命名空间里的a,如果要使用NameSpaceB命名空间中的a,则仍需要使用这样的方式 NameSpaceB::a;
using NameSpaceA::a;
a = 20;                // 使用命名空间NameSpaceA中的a
NameSpaceB::a = 30;    // 使用命名空间NameSpaceB中的a

using 声明不仅可以针对命名空间中的变量或者函数,还可以对整个命名空间进行声明,这样的方式声明命名空间以后,在后面使用未指定具体命名空间的变量或者函数产生命名冲突的时候,默认使用 NameSpaceB中的变量和函数。

using namespace NameSpaceB;
a = 10;
 
printf ("%d\n", NameSpaceB::a);

示例代码:

#include <iostream>

namespace A
{
	int a = 1;
	void print()
	{
		std::cout << "this is namespace A" << std::endl;     //::作用域限定符
	}
}

namespace B
{
	int a = 2;
	void print()
	{
		std::cout << "this is namespace B" << std::endl;
	}
}

int main()
{
	//std::cout << a << std::endl;   //a不是全局变量也不是main函数局部变量 所以未定义
	std::cout << A::a << std::endl;

	using namespace B;
	std::cout << a << std::endl;

	print();

	A::print();

	//using namespace A;// 这里如果不注释掉,编译不通过
	print();

	return 0;	
}

在这里插入图片描述

1.3 register关键字的变化

  • register关键字请求“编译器”将局部变量存储于寄存器中;
  • C语言中无法取得register变量地址
  • 在C++中依然支持register关键字
    1、C++编译器有自己的优化方式,不使用register也可能做优化
    2、C++中可以取得register变量的地址
  • C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。
#include <stdio.h>

int main()
{
	register int i = 0;    //声明寄存器变量 不能取地址

	for (i = 0; i < 1000; i++);

	&i;     //C++  对寄存器变量取地址 register 关键字变得无效

	return 0;
}

1.4 变量检测加强

  • 在C语言中重复定义多个全局变量是合法的,这些同名的全局变量最终都会被链接全局数据区的同一个地址空间上
  • 在C++中不允许定义多个同名的全局变量
#include <stdio.h>
 
// 在C语言中重复定义多个全局变量是合法的
// 这些同名的全局变量最终都会被链接全局数据区的同一个地址空间上
int g_a;
int g_a = 1;
 
int main()
{
    printf ("%d\n", g_a);
    printf ("%p\n", &g_a);
 
    return 0;
}

1.5 struct类型加强

  • C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型
  • C++中的struct是一个新类型的定义声明
#include <stdio.h>
 
struct Student
{
    char name[20];
    int age;
};
 
int main()
{
    // C语言中 struct 定义了一组数据的集合,而不是一种新的数据类型
    // 所以在定义变量的时候需要在前面加上 struct 关键字进行修饰
    // C++中 struct 定义了一种新的数据类型,可以直接用来定义变量
    Student stu1 = {"xiaoming", 10};
 
    return 0;
}

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

1.6.1 C语言中函数的一些不好的使用方式

  • 1 函数可以没有返回参数类型
  • 2 函数参数可以没有数据类型
  • 3 没有参数的函数可以接收任意个参数
#include <stdio.h>
// 1 函数可以没有返回参数类型
f()
{
    printf ("hello world\n");
}
 
// 2 函数参数可以没有数据类型
g(i)
{
    return i;
}
 
int main()
{
    // 3 没有参数的函数可以接收任意个参数
    f(1,2,3,4,5);
 
    g(12,15);
 
    return 0;
}

1.6.2 C++中的加强

  • 在C语言中
    int f( );表示返回值为int,接受任意参数的函数
    int f(void);表示返回值为int的无参函数

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

  • C++更加强调类型,任意的程序元素都必须显示指明类型

1.7 新增bool类型关键字

  • C++在C语言的基本类型系统之上增加了bool,C++中的bool可取的值只有true和false
  • 理论上bool只占用一个字节,如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现
  • true代表真值,编译器内部用1来表示;false代表非真值,编译器内部用0来表
  • bool类型只有true(非0)和false(0)两个值;C++编译器会在赋值时将非0值转换为true,0值转换为false
#include <iostream>

using namespace std;

int main()
{
    bool a = true;
    bool b = false;

    a = 100;

    cout << a << endl;// 输出1
    cout << b << endl;// 输出0
    
    return 0;
}

1.8 三目运算符的增强

  • C语言返回变量的值 C++语言是返回变量本身
    (1)C语言中的三目运算符返回的是变量值,不能作为左值使用
    (2)C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方

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

  • C语言如何支持类似C++的特性呢?
    ==>当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已

#include <stdio.h>
 
// C语言中表达式的结果 放在什么地方? ==> 寄存器
// 1
// 表达式返回的是一个值,是一个数
// 在C++中,表达式返回的是变量本身
 
// 2 如何做到的
// 让表达式返回一个内存空间..内存的首地址 指针
// 在C语言中如何实现C++的效果
 
// 3 本质
// C++编译器自己做了取地址的操作
int main()
{
    int a = 10;
    int b = 20;
 
    // C++中三目运算符返回的是变量本身,所以可以作为左值使用
    // 这里C语言会报错(20 = 10),c++可以(b = 100)
    (a > b ? a : b) = 90; 
 
    // 在C语言中让三目运算符可以当左值使用,可以通过返回变量地址实现
    *(a > b ? &a : &b) = 90;
    printf ("%d, %d\n", a, b);
 
    return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ELK日志分析--Kibana

Kibana 概述 部署安装浏览页面并使用 1.Kibana 概述 Kibana-是进入Elastic的窗口使用Kibana&#xff0c;可以 1 搜索&#xff0c;观察和保护。 从发现文档到分析日志再到发现安全漏洞&#xff0c;Kibana是您访问这些功能及其他功能的门户。 2 可视化和分析您的数据。 搜索隐藏的…

github ssh密钥配置,克隆远程仓库

GitHub的SSH配置 在往github上push项目的时候&#xff0c;如果走https的方式&#xff0c;每次都需要输入账号密码&#xff0c;非常麻烦。而采用ssh的方式&#xff0c;就不再需要输入&#xff0c;只需要在github自己账号下配置一个ssh key即可&#xff01; 很多朋友在用github管…

kkfileview在预览word文档中文乱码

因为liunx服务器没有相关中文字体 1.下载中文字体包 http://kkfileview.keking.cn/fonts.zip 2.上传服务器至目录/usr/share/fonts 解压 unzip fonts.zip 3.执行命令 mkfontscale mkfontdir fc-cache 如果报错命令没有找到&#xff0c;则安装对应命令&#xff0c;例如 yum in…

Mikrotik Ros安全加固

基本概述 Mikrotik系列路由器也成RouterOS软路由&#xff0c;RouterOS是基于Linux内核的网络操作系统&#xff0c;其预装在MikroTik生产的路由器、无线设备以及RouterBOARD上。同时&#xff0c;它也可以安装在x86平台的个人电脑上&#xff0c;用于将电脑转化为路由器&#xff…

【01】从零开始学Python—数据分析与挖掘概述

马云曾说“中国正迎来从IT时代到DT时代的变革”&#xff0c;DT就是大数据时代。数据已成为企业的核心资产和宝贵资源&#xff0c;企业愈加重视和善加利用数据分析与挖掘技术。 1.1什么是数据分析与挖掘 数据分析和挖掘都是基于搜集来的数据&#xff0c;应用数学、统计、计算机…

6个思维矩阵,90%的项目经理都收藏了

早上好&#xff0c;我是老原。我们都是知道&#xff0c;项目经理的管理能力如何&#xff0c;往往也决定项目的走向如何&#xff1f;今天老原给大家分享这6个管理矩阵&#xff0c;是每一位项目经理需要修炼的能力。01、项目领导力矩阵项目领导力矩阵还是蛮有意思的&#xff0c;四…

记忆化搜索

一.记忆化搜索概述 1.概念 搜索是一种简单有效但是效率又很低下的算法结构&#xff0c;其低效的原因主要在于存在很多重叠子问题。而记忆化搜索则是在搜索的基础上&#xff0c;利用数组来记录已经计算出来的重叠子问题状态&#xff0c;进行合理化的剪枝&#xff0c;从而降低时…

程序员如何发展第二职业?这几种副业方式超赚钱

很多程序员曾表示&#xff0c;虽然月薪一两万&#xff0c;但有时候还是会焦虑。 尤其是遇上了年初裁员年底裁员这样的就业环境&#xff0c;焦虑就会逐步放大&#xff0c;这时候副业赚钱的重要性就体现出来了。 发展第二职业&#xff0c;可以让程序员们增加抗风险能力&#xf…

扩展学习之时间戳趣谈

目录 一、介绍 二、转换工具 三、获取Unix时间戳的指令 四、普通时间转Unix时间戳 五、扩展 一、介绍 时间戳&#xff1a;一份数据在特定时间点存在的可验证的数据。 Unix时间戳&#xff08;英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp&#xff09;&…

(二十七)大白话在Buffer Pool执行完增删改之后,写入日志文件的redo log长什么样?

昨天我们简单给大家回顾了一下在数据库里执行增删改操作的时候&#xff0c;redo log是用来干什么的&#xff0c;为什么需要这个东西&#xff0c;如果没有他会怎么样&#xff0c;有了他之后又能有什么样的效果&#xff0c;想必大家现在都对redo log这个东西有一定的理解了。 那…

高性能低功耗4口高速USB2.0 HUB 完美替代FE1.1S和FE8.1

该NS1.1s是一个高度集成的&#xff0c;高品质&#xff0c;高性能&#xff0c;低功耗&#xff0c;为USB 2.0高速4端口集线器又低成本的解决方案。 &#xff08;点击即可咨询芯片详细信息&#xff09; NS1.1s的特点 1.通用串行总线规范修订版2.0&#xff08;USB 2.0&#xff09;完…

LeetCodeHOT100热题01

写在前面 主要分类一下刷题遇到的一些题型。有很多思路的图都来源于力扣的题解&#xff0c;如侵权会及时删除。不过代码都是个人实现的&#xff0c;所以有一些值得记录的理解。之前的算法系列参看&#xff1a; 剑指offer算法题01剑指offer算法题02 一、哈希表 1. 两数之和 …

自然语言处理(NLP)之近似训练法:负采样与层序Softmax

我们在前面介绍的跳字模型与连续词袋模型有个缺陷就是在计算梯度时的开销随着词典增大会变得很大&#xff0c;因为每一步的梯度计算都包含词典大小数目的项的累加。为了降低这种带来的高计算复杂度&#xff0c;介绍两种近似的处理方案&#xff1a;负采样和层序softmax负采样(Ne…

PADS新建封装中焊盘部分修正

在PADS新建封装中&#xff0c;需要修改焊盘参数。因为之前做板&#xff0c;有问题工厂都会帮忙修正&#xff0c;所以忽略了焊盘中阻焊层和助焊层。这里专门做一个修正。进入焊盘栈编辑界面之后&#xff0c;需要点击“添加层”&#xff0c;然后选择阻焊层顶层&#xff08;Solder…

以太网分析仪

以太网分析仪顾名思义&#xff0c;就是针对网络性能方面的网络丢包、延迟、抖动等问题进行分析哪个环节出现了问题&#xff0c; 这种网络测试仪&#xff0c;市面上的品牌还是比较多的&#xff0c;价格也是有高有低&#xff0c;那么&#xff0c;如何从这么多仪器仪表里面选择一款…

JS逆向之BackTest入门滑块与表单加密

声明&#xff1a;本文仅限学习交流使用&#xff0c;禁止用于非法用途、商业活动等。否则后果自负。如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01;本教程也没有专门针对某个网站而编写&#xff0c;单纯的技术研究 一、本期逆向 1.网站&#xff1a;aHR0cDovL2JhY…

聊聊 HTAP 的前世今生

随着现代社会大型实时分析应用的逐渐流行&#xff0c;关系型数据库已经难以处理高并发的事务请求。商业层面上&#xff0c;当全球进入数字化时代&#xff0c;数字化技术渗透到各行各业&#xff0c;同时产生了海量数据&#xff0c;数据的存储和应用是企业决策的重要依据之一&…

计网数据链路层

第二层:数据链路层 数据链路层传输单位为帧 数据链路层三大问题&#xff1a;封装成帧&#xff0c;差错检测&#xff0c;可靠传输 两个协议&#xff1a; 共享式以太网的媒体接入控制协议CSMA/CD 802.11局域网的媒体接入控制协议CSMA/CA 在封装成帧的问题中&#xff0c;数据链路层…

100种思维模型之诺依曼思维模型-019

生活中&#xff0c;难免总会遇到一些“大”、“笼统”、“难入手”的问题&#xff01; 如&#xff0c;前几天突然接到领导安排&#xff0c;帮忙梳理一个材料“***景区创建5A级旅游景区提升规划”。 对于一个没有学过景区提升规划、没有做过规划的我来说&#xff0c;真的挺难的…

Mysql 索引(三)—— 不同索引的创建方式(主键索引、普通索引、唯一键索引)

了解了主键索引的底层原理&#xff0c;主键索引其实就是根据主键字段建立相关的数据结构&#xff08;B树&#xff09;&#xff0c;此后在使用主键字段作为条件查询时&#xff0c;会直接根据主键查找B树的叶子结点。除了主键索引外&#xff0c;普通索引和唯一键索引也是如此&…