初识C++:开启C++之旅

news2024/12/26 18:15:31

目录

1.C++的第一个程序

2.namesapce命名空间域

2.1namespace的意义

2.2.2namespace的定义

2.3命名空间的使用

3.C++输入/输出 

4.缺省参数

5.函数重载

6.引用

 

6.1引用的特性

6.2引用的使用

 


1.C++的第一个程序

c++版本:

#include<iostream>

using std::cout;
using std::endl;

int main()
{

	cout << "Hello Word!" << endl;
	

	return 0;
}

此外,由于C++是兼容绝大多数c语言的语法的我们还可以用c语言的方式实现。

#include<iostream>

using std::cout;
using std::endl;

int main()
{

	//cout << "Hello Word!" << endl;

	printf("Hello Word!");
	

	return 0;
}

2.namesapce命名空间域

2.1namespace的意义

在c\c++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的就是对标识符的名称进行本地化,以免命名冲突或名字污染,namespace关键字的出现就是针对这种问题。

举个例子:c语言项目类似下面程序这样的命名冲突是普遍存在的问题,c++引入namespace就是为了更好的解决这样的问题。

 此时我们在c++当中引用namespace就不会有这种问题:

#include<iostream>
#include<stdlib.h>
//命名域将rand和函数rand隔开
namespace lcl
{
	int rand = 10;
}

using namespace::std;

int main()
{
	cout << lcl::rand << endl;

	return 10;
}

2.2.2namespace的定义

1.定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量、函数、类型等 。

2.namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand就不在冲突了。

//命名域将rand和函数rand隔开
namespace lcl
{
	int rand = 10;

	int Add(int x, int y)
	{
		return x + y;
	}

	struct Node
	{
		struct Node* next;
		int data;
	};
}

using namespace::std;

int main()
{

	//这里访问的是rand函数指针
	printf("%p\n", rand);

	//这里访问的时lcl命名空间中的rand
	printf("%d\n", lcl::rand);



	//cout << lcl::rand << endl;

	return 10;
}

3.C++中域有函数局部域、全局域、命名空间域,类域;域影响的是编译时语法查找一个变量、函数、类型出处的逻辑,所以有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域都不影响变量的生命周期。

4.namespace只能定义在全局,当然它还可以嵌套定义。

#include<iostream>

namespace A
{
	namespace lcl
	{
		int rand = 10;

		int Add(int x, int y)
		{
			return x + y;
		}

		struct Node
		{
			struct Node* next;
			int data;
		};
	}

	namespace xyy
	{
		int rand = 2;

		int Add(int x, int y)
		{
			return x + y;
		}

	}

}

using namespace std;

int main()
{
	//使用lcl的命名空间
	printf("%d\n", A::lcl::rand);

	//使用xyy的命名空间
	printf("%d\n", A::xyy::rand);



	return 0;
}

5.项目工程中多文件定义的同名namespace会认为时一个namespace,不会冲突。

C++标准库都放在一个叫std(standard)的命名空间中。

2.3命名空间的使用

编译查找一个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去找。所以我们要使用命名空间中定义的变量、函数,有三种方式:

1.指定命名空间访问,项目中推荐 这种方式

2.using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员 推荐这种方式。

3.展开命名空间全部成员,项目不推荐,平时练习的时候可以这样。 

#include<iostream>

namespace lcl
{
	int a = 20;
	int b = 10;
}
//将命名空间中的a展开
using lcl::a;
using namespace std;
int main()
{
	cout << a << endl;

	cout << lcl::b << endl;

	return 0;
}
#include<iostream>

namespace lcl
{
	int a = 20;
	int b = 10;
}
//将命名空间全部展开
using namespace lcl;
using namespace std;
int main()
{
	cout << a << endl;

	cout << b << endl;

	return 0;
}

3.C++输入/输出 

 <iostream> 是 Input Output Stream 的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输

出对象。
std::cin 是 istream 类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输
⼊流。
std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流。
std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。
<<是流插⼊运算符,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)
使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊输出可以⾃动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是C++的流能更好的⽀持⾃定义类型对象的输⼊输出。
IO流涉及类和对象,运算符重载、继承等很多⾯向对象的知识,这些知识我们还没有讲解,所以这 ⾥我们只能简单认识⼀下C++ IO流的⽤法,后⾯我们会有专⻔的⼀个章节来细节IO流库。
cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要
通过命名空间的使⽤⽅式去⽤他们。
⼀般⽇常练习中我们可以using namespace std,实际项⽬开发中不建议using namespace std。
这⾥我们没有包含<stdio.h>,也可以使⽤printf和scanf,在包含<iostream>间接包含了。vs系列
编译器是这样的,其他编译器可能会报错。

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

int main()
{
	int a = 10;
	double b = 1.1;
	char c = 'a';

	cout << a << " " << b << " " << c << endl;
	std::cout << a << " " << b << " " << c << std::endl;
	
	scanf_s("%d%lf", &a, &b);
	printf("%d %lf\n", a, b);

	//可以自动识别变量类型
	cin >> a >> b >> c;
	cout << a << " " << b << " " << c << endl;

	return 0;
}
#include<iostream>
using namespace std;

int main()
{
	int a = 10;
	double b = 1.1;
	char c = 'a';

	//在io需求比较高的地方,如部分大量输入的竞赛题中,加上一下三行代码可以提高C++IO效率
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	//可以自动识别变量类型
	cin >> a >> b >> c;
	cout << a << " " << b << " " << c << endl;

	return 0;
}

4.缺省参数

缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参
则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把
缺省参数也叫默认参数)
全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。
带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。
函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省
值。
#include<iostream>

namespace lcl
{
	// 命名空间中可以定义变量/函数/类型
	int rand = 10;
	int Add(int left, int right)
	{
		return left + right;
	}
	struct Node
	{
		struct Node* next;
		int val;
	};
}

using std::cout;
using std::endl;

//缺省参数
void Fun(int a = 10)
{
	cout << a << endl;
}

//全缺省
void test(int a = 20, int b = 40, int c = 50)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

//半缺省
void test2(int a, int b = 30, int c = 40)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}



int main()
{
	//缺省参数
	Fun();
	Fun(22);

	test();
	test(70);
	test(100, 200);
	test(200.300,400);

	test2(100);
	test2(100,200);
	test2(100,200,300);

}

5.函数重载

C++支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同,这样C++函数调用就表现出了多态行为,使用更加灵活,c语言是不支持这个的。

#include<iostream>

using namespace std;

//1.参数类型不同
int Add(int x, int y)
{
	cout << "int Add(int x, int y)" << endl;
	return x + y;
}

double Add(double x, double y)
{
	cout << "double Add(double x, double y)" << endl;
	return x + y;
}

//2.参数个数不同

void fun()
{
	cout<<"void fun()" << endl;
}

void fun(int a)
{
	cout << "void fun(int a)" << endl;
}

//3.参数类型顺序不同

void f(int a, double b)
{
	cout << "void f(int a, double b)" << endl;
}

void f(double a, int b)
{
	cout << "void f(double a, int b))" << endl;
}

int main()
{
	Add(1, 2);
	Add(1.2, 2.2);

	fun();
	fun(10);

	f(10, 2.2);
	f(10.1, 22);

	return 0;
}

注意:返回值不同不能作为函数重载条件,因为调用时也无法区分

6.引用

引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。

#include<iostream>
using namespace std;


//引用的使用
void swap(int& rx, int& ry)
{
	int tmp = rx;
	rx = ry;
	ry = tmp;
}

int main()
{

	//引用
	int a = 10;

	//引用:b和c是a的别名
	int& b = a;
	int& c = a;
	//也可以给b取别名相当于还是给a取别名
	int& d = b;
	d++;
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
	cout << d << endl;

	return 0;
}

6.1引用的特性

1.必须初始化才能使用

2.一个变量有多个引用

3.引用一旦引用了一个实体,就不能引用其他实体

6.2引用的使用

引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被 引⽤对象。
引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。
引⽤返回值的场景相对⽐较复杂,我们在这⾥简单讲了⼀下场景,还有⼀些内容后续类和对象章节 中会继续深⼊讲解。
引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引⽤跟其他
语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向,
Java的引⽤可以改变指向。
⼀些主要⽤C代码实现版本数据结构教材中,使⽤C++引⽤替代指针传参,⽬的是简化程序,避开复杂的指针,但是很多同学没学过引⽤,导致⼀头雾⽔。
#include<iostream>
using namespace std;


//引用的使用
void swap(int& rx, int& ry)
{
	int tmp = rx;
	rx = ry;
	ry = tmp;
}

int main()
{

	//引用
	int a = 10;

	//引用:b和c是a的别名
	int& b = a;
	int& c = a;
	//也可以给b取别名相当于还是给a取别名
	int& d = b;
	d++;
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
	cout << d << endl;


	//引用的使用
	int i = 10;
	int j = 30;
	swap(i, j);
	cout << i << endl;
	cout << j << endl;


	return 0;
}

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

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

相关文章

kali安装wechart

前言&#xff1a; 突发奇想想在kali安装个wechart&#xff0c;试了下网上的很多&#xff0c;玩坏了一个虚拟机算是找到了一个不错的方法&#xff0c;这里记录下&#xff0c;防迷路 基础配置&#xff1a; 首先修改源&#xff1a; vim /etc/apt/sources.list 注释默认配置&…

EasyCVR视频汇聚平台:打造全栈视频监控系统的基石,解锁可视化管理与高效运维

随着科技的飞速发展&#xff0c;视频监控已成为现代社会不可或缺的一部分&#xff0c;广泛应用于社区、公共场所、工业领域等多个场景。EasyCVR视频汇聚平台&#xff0c;作为一款高性能的视频汇聚管理平台&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;在构建全…

centos8 安装zookeeper

1&#xff1a;下载 zookeeper官网 解压&#xff1a;tar -zxvf apache-zookeeper-3.6.3.tar.gz 修改自己想要的文件目录 mv apache-zookeeper-3.6.3 zookeeper_3.6.3 备份一下 配置文件 cp zoo_sample.cfg zoo.cfg vim zoo.cfg 编辑日志文件和端口号

nginx实战演练

目录 一.Nginx架构和安装&#xff08;未完待续&#xff09; <1>.Nginx概述 <2>.Nginx架构和进程 <3>.Nginx模块 <4>.Nginx安装(编译安装) 二.Nginx基础配置 <1>.关闭debug <2>.将nginx软件添加到环境变量 <3>.开机自启动脚…

EmguCV学习笔记 VB.Net 2.5 Mat类、Matrix类和Image类的相互转换

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV学习笔记目录 Vb.net EmguCV学习笔记目录 C# 笔者的博客网址&#xff1a;VB.Net-CSDN博客 教程相关说明以及如何获得pdf教…

基于Vue的MES生产制造执行系统

TOC springboot307基于Vue的MES生产制造执行系统 第1章 绪论 1.1 选题动因 到现在为止&#xff0c;互联网已经进入了千家万户&#xff0c;最普通的平民百姓也有属于自己的智能设备&#xff0c;计算机各种技术的储备也是相当的丰富&#xff0c;并且实现也是没有难度&#xf…

VSCode配置ssh免密连接远程服务器

我配置了免密设置(Windows利用ssh免密码登录Linux)&#xff0c;git bash已经能够正常连接了&#xff0c;但是vscode还是不行&#xff0c;很奇怪。 VSCode报错信息&#xff1a; [17:55:50.360] SSH Resolver called for "ssh-remote106.52.2.19", attempt 5, (Recon…

《机器学习》——运用OpenCV库中的KNN算法进行图像识别

文章目录 KNN算法的简单介绍下载OpenCV库实验内容实验结果完整代码自己手写数字传入模型中测试 KNN算法的简单介绍 一、KNN算法的基本要素 K值的选择&#xff1a;K值代表选择与新测试样本距离最近的前K个训练样本数&#xff0c;通常K是不大于20的整数。K值的选择对算法结果有重…

电压检测之比较电路

设计这款电路主要是本人在锂电池充电电路中挖了一个坑&#xff0c;对电源显示芯片的数据手册内容撰写不够详细的不好感受&#xff0c;所以自己根据比较电路的思想设计出了电压检测并反馈的电路&#xff0c;亦在提供一种电压检测的思想不需要借助ADC采集&#xff0c;在电路硬件上…

基于hive的海鲜交易数据分析系统设计与实现【hadoop、Flask、某东爬虫、sqoop、flume、mysql、hdfs】商品可换

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍研究背景国内外研究现状研究目的研究意义 关键技术理论介绍数据采集及预处理数据采集字段介绍数据预处理hadoop集群搭建及实现过程hive建表hive大数据分析 可视化展示店铺维度画像分…

AR 眼镜之-开关机定制-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 开关机定制 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;开机 Logo 2&#xff09;开机音效 3&#xff09;开机动画 4&#xff09;关机动画 5&#xff09;关机弹窗 2. &#x1f4a0; 开机 Logo…

C++笔试题汇总

C笔试题汇总记录 一、概述二、概念分类1. 结构体1. C 和 C 中 struct 有什么区别&#xff1f;2. C中的 struct 和 class 有什么区别&#xff1f; 2. 类相关1. 类的大小1. 空类的大小2. 一般非空类大小3. 有虚函数类4. 有虚函数类的继承5. 只有虚函数6. 静态数据成员 2. C的三大…

【分享】格力手机色界G0245D 刷REC、root、 救砖、第三方rom教程和资源

开门见山 帮别人弄了一台 格力G0245D&#xff0c;把找到的资源和教程分享一下 教程 这个写的很详细了格力手机色界G0245D-Root-最简指南 不过教程里刷rec这一步漏了加上电源键&#xff0c;加上就行了。 附加参考&#xff1a;格力手机2刷机 格力手机二代刷机 GREE G0215D刷机…

C++ 特殊类设计以及单例模式

目录 1 不能被拷贝 2 只能在堆上创建对象 3 只能在栈上创建对象 4 禁止在堆上创建对象 5 不能被继承的类 6 单例类 特殊类就是一些有特殊需求的类。 1 不能被拷贝 要设计一个防拷贝的类&#xff0c;C98之前我们只需要将拷贝构造以及拷贝赋值设为私有&#xff0c;同时只声明…

在HFSS中对曲线等结构进行分割(Split)

在HFSS中对曲线进行分割 我们往往需要把DXF等其他类型文件导入HFSS进行分析&#xff0c;但是有时需要对某一个曲线单独进行分割成两段修改。 如果是使用HFSS绘制的曲线&#xff0c;我们修改起来非常方便&#xff0c;修改参数即可。但是如果是导入的曲线&#xff0c;则需要使用…

代码随想录训练营 Day31打卡 贪心算法 part05 56. 合并区间 738. 单调递增的数字 968. 监控二叉树

代码随想录训练营 Day31打卡 贪心算法 part05 一、 力扣56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中…

【JavaEE】JVM 内存区域划分,以及 Java 垃圾回收机制引用计数器,可达性分析等

目录 1. JVM执行流程 2. JVM运行时数据区 2.1 堆 2.2 Java虚拟机栈(线程私有) 2.3本地方法栈(线程私有) 2.4 程序计数器 2.5 元数据区 3. JVM的类加载机制 1) 加载 2) 验证 3) 准备 4) 解析 5) 初始化 双亲委派模型 4. java垃圾回收 4.1 死亡对象判断方法 a) …

超精细CG杰作:8K壁纸级官方艺术插画,展现极致美丽与细节的汉服女孩

极致精美的数字艺术杰作&#xff1a;8K壁纸级别的官方插画&#xff0c;展现超高清细节与和谐统一的美感&#xff0c;女孩的精致面容与眼神在光影下熠熠生辉&#xff0c;汉服主题下的超高分辨率作品&#xff0c;文件巨大&#xff0c;细节丰富&#xff0c;令人惊叹。 正向提示词…

内存泄漏之如何使用Visual Studio的调试工具跟踪内存泄漏?

使用Visual Studio的调试工具跟踪内存泄漏是一个系统性的过程&#xff0c;主要包括启用内存泄漏检测、运行程序、分析内存使用情况以及定位泄漏源等步骤。 Visual Studio提供了多种方式来检测内存泄漏&#xff0c;你可以根据自己的需求选择合适的方法。 注意&#xff1a;下面…

父页面选项式api,子页面组合式api,子页面如何获取父页面的方法以及传值到将子页面的值传给父页面

开发的项目中是vue3的项目&#xff0c;但是有些同事用vue2中的选项式api写法&#xff0c;有些同事使用的是vue3组合式api的写法&#xff0c;此时子页面需要获取父页面的方法把数据传入父页面的方法中 父页面&#xff1a; 在父页面中order-item组件中创建自定义方法navigation和…