C++:入门详解(关于C与C++基本差别)

目录

一.C++的第一个程序

二.命名空间(namespace)

1.命名空间的定义与使用:

(1)命名空间里可以定义变量,函数,结构体等多种类型

(2)命名空间调用(::)与展开

(3)命名空间的嵌套

(4)具体使用场景

三.缺省参数

1.基本定义:

2.几个注意:

四.函数重载

1.定义与使用:

五.引用

1.定义:

2.引用的特性:

3.引用的使用(区别传值返回和传引用返回):

4.const引用:

六.inline内联


一.C++的第一个程序

C++作为C语言的升级版,除了可以无缝兼容C语言的各种语法结构和各种框架外,在很大程度上对C语言的许多代码进行了优化升级,在保持原有代码逻辑结构相同的情况下,C++的简便性和应用性相比C语言不可同日而语,以下我要阐述的就是在学完C语言然后进入C++后需要掌握的一些基础知识首先来看第一个C++程序

#include<iostream>//C++需要包含的头文件
using namespace std;//展开对应的命名空间
int main()
{
	cout << "hello world" << endl;//区别于C语言的输出方式
//cout<<输出内容,后面的endl是换行(endline),但和C语言里面的\n不用,endl是一个函数。

	return 0;
}

基础结构大概就是这样,下面就是对每一部分的具体介绍:

二.命名空间(namespace)

1.命名空间的定义与使用:

书面上的定义简而言之是:namespace的本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量

(1)命名空间里可以定义变量,函数,结构体等多种类型
#include<iostream>
namespace space
{
//定义变量
	int rand = 10;
	char time = 20;
//定义函数
	int add(int a, int b)
	{
		return a + b;
	}
//定义结构体
	struct student
	{
		char name[20];
		char sex[6];
		int age;
	};
}
int main()
{
	return 0;
}
(2)命名空间调用(::)与展开

 在调用的时候,只要用空间名::函数名这样的格式来调用

#include<iostream>
int main()
{
	std::cout << "hello world" << std::endl;
 
	return 0;
}

 也可以只展开一个命名空间中的某个变量或函数,这样的话访问这个变量或函数就更简便

#include<iostream>
using namespace std;
namespace b
{
	int test(int x, int y)
	{
		return x + y;
	}
}
using b::test;
int main()
{
	int m = test(1, 5);

	cout << m;
	return 0;
}
(3)命名空间的嵌套
#include<iostream>
using namespace std;
namespace a
{
	int test(int x, int y)
	{
		return x + y;
	}
	namespace b
	{
		int test(int x, int y)
		{
			return x * y;
		}
	}

}
int main()
{
	int m = a::test(2, 3);
	int n = a::b::test(2, 3);
	cout << m << " " << n;
	return 0;
}
(4)具体使用场景
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
 // 编译报错:error C2365: “rand”: 重定义;以前的定义是“函数” 
 printf("%d\n", rand);
 return 0;
}

这样写c语言会报错:报错的原因就是我们自己定的变量rand和C语言自带的库函数冲突了,这时候编译器就无法识别,这其实是C语言的不足之处。而c++中的命名空间就完美的解决这个问题

三.缺省参数

1.基本定义:

在函数定义时为参数指定的默认值,当调用函数时如果没有传递该参数,则使用默认值。这样可以提高函数的灵活性和可重用性
举例例如一个计算面积的函数,参数有长和宽,其中宽可以设为默认值1,这样调用时只传长就可以得到正方形的面积,这样的例子比较直观

#include<iostream>
using namespace std;
int test(int x = 2, int y = 6)
{
	return x + y;
}
//如果调用这个函数但是不传递参数,那么返回结果就是8,同样如果掺入参数1和2,那么返回结果就是3

2.几个注意:

(1)缺省参数必须从右往左给,比如上面的程序,我们只给x缺省参数但不给y缺省参数这样其实是不合法的  

(2)函数实参一定是从左往右给函数的

(3)函数声明和定义分离时,不能在声明和定义中同时给缺省值

#include<iostream>
using namespace std;
 
int test(int x = 1, int y = 2);
int main()
{
	int a = test();
	cout << a;
	return 0;
}
int test(int x = 1, int y = 2)
{
	return x + y;
}
//比如这样同时个给缺省值的函数是不合法的,一般只在声明中给缺省值

四.函数重载

1.定义与使用:

即重名函数可以通过识别传入的参数类型来自动选择相对应的函数,例如:

#include<iostream>
using namespace std;
 
int test(int x , int y )
{
	return x + y;
}
double test(double x, double y)
{
	return x + y;
}
int main()
{
	double x = 1.5, y = 2.8;
	int a = test(1,2);
	double b = test(x, y);
	cout << a <<" "<< b ;
	return 0;
}

五.引用

1.定义:

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间,但实际上在C++的底层逻辑里引用依旧是以指针的形式存在,但我们在实际使用中并不需要考虑那么多,就当引用是C++给我们带来的一种更加方便写代码的方法就行了,以下是引用使用的基本规则:

类型& 引用别名=引用对象

#include<iostream>
using namespace std;
int main()
{
	int a = 30;
	//一个变量可以取多个别名
	int& b = a;//给a变量取别名
	int& c = a;//c也是a的别名
	int& d = b;//给b变量取别名,相当于d也是a的别名
	cout << &a << endl << &b << endl << &c << endl << &d << endl;
    //从地址中也可以看出来a,b,c,d占用同一块内存空间
	return 0;
 
}

当然,引用相对指针是非常方便好理解的,我举个例子:

#include<iostream>
using namespace std;
//传址调用,指针
void swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
//引用
void swap(int& a, int& b)//函数重载
{
	int tmp = a;
	a = b;
	b = tmp;
}
int main()
{
	int a = 10;
	int b = 20;
	swap(a, b);
	swap(a, b);
	return 0;
}

2.引用的特性:

(1)引用必须在定义时初始化。比如int& a=0;这句代码其实是不合法的

(在 C++ 中,引用必须在定义时初始化,这意味着当声明一个引用变量时,必须立即将其绑定到一个已存在的对象(变量、常量或表达式的结果),与普通变量不同,普通变量可以在后续赋值时初始化)

(2)一个变量可以有多个引用

(3)引用一旦引用一个实体,再不能引用其他实体

举个栗子:

#include<iostream>
using namespace std;
 
int main()
{
	int a = 10;
	int& b = a;
	int c = 20;
	b = c;
	cout << &a <<" "<< &b <<" "<< &c << endl;
	cout << a <<" "<< b <<" "<< c << endl;
	return 0;
}
//这里进行了b=c的操作,只是把c的值赋值给了b,但并没有改变b的引用实体,因此a和b地址是相同的

3.引用的使用(区别传值返回和传引用返回):

引用在实践中主要是于引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被 引用对象

引用传参介绍过了,然后我们看一下引用做返回值(即传引用返回)与传值返回区别

int STTop(ST& rs)//注意这里是传值返回(因为返回类型是int二百元引用类型的int&)
{
 assert(rs.top > 0);
 return rs.a[rs.top];
}
int main()
{
 ST st1;
 STInit(st1);
 STPush(st1, 1);//入栈
 STPush(st1, 2);
 STTop(st1)+=10;
 return 0;
}

截取了一部分之前栈的操作,发现对于STTop(st1)+=10;这个操作无法达到目的,

我们本意想的是让栈顶的数据加上10,但是实际上栈顶的数据并没有改变     

这是因为这串代码返回的是一个值,相当于我们把原来的数拷贝出了他的值然后返回了,

因此就算把这份拷贝的值加上10也无法改变原来的栈顶数据

以上发生的情况就是由传值引用引发的,传值引用简而言之就是为了保护源数据不被修改的场景二存在,通过返回对栈顶元素的值的拷贝,从而使实际上的栈顶元素不受改变

但如果代码这样改,就可以轻易改变栈顶元素的值:

(即传引用返回)

int& STTop(ST& rs)
{
 assert(rs.top > 0);
 return rs.a[rs.top];
}
int main()
{
 ST st1;
 STInit(st1);
 STPush(st1, 1);
 STPush(st1, 2);
 STTop(st1)+=10;
 return 0;
}

4.const引用:

const引用简而言之就是对引用范围的缩小:即  const对象必须用const引用,普通对象也可以用const引用,但普通引用引用不了const对象

#include<iostream>
using namespace std;
int main()
{
	const int a = 10;//只可读
	//int& b = a;
	//发生错误,b可读可写,权限变大
	//应加上const 
	const int& b = a;
	int c = 20;
	const int& d = c;//权限缩小,可以
	c++;
	//d++不可以;c可以改变,d不可以
	return 0;
}

 这些就涉及到权限的问题,普通对象是一个变量,可以被改变的,所以他的权限更低。而const对象不能被改变所以他的权限更高。普通引用引用const对象权限就放大了,所以编译器会报错,反过来const引用可以引用普通对象,因为权限是可以缩小的,总结来说:访问权限可以缩小,但是不能放大(访问权限只针对引用和指针)

六.inline内联

在 C++ 中,内联函数(Inline Functions)是一种优化机制,旨在通过在编译时将函数体直接替换到调用位置,减少函数调用的开销(如栈帧压入/弹出、参数传递等)

#include<iostream>
using namespace std;
inline int add(int x,int y)
{
	return x + y;
}
int main()
{
	cout << add(1, 5) << endl;
 
	return 0;
}

对于短小的函数,inline操作会使函数在编译时展开,可以提高效率。但是如果这个函数过长就不适合使用内联了,过长的函数内联反而会降低时间,因此,内联函数也并不是万能的

    还有一点非常值得注意,就是内联函数的定义和声明必须在同一个文件

欧克了,C++的入门知识大概就是这些了,相比C语言,还是由很多需要管制与在意的地方,那就先这样吧

全文终

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis 数据持久化之AOF

AOF&#xff08;Append Only File&#xff09; 以日志的形式来记录每个写操作&#xff0c;将Redis执行过的所有写指令记录下来&#xff08;读操作不记录&#xff09;&#xff0c;只许追加文件但不可以改写文件&#xff0c;redis启动之初会读取该文件重新构建数据&#xff0c;换…

网格图学习(附题单与做题思路)

文章目录 一、DFS 经典题型695. 岛屿的最大面积 二、BFS 经典题型994. 腐烂的橘子**算法选择对照表** 一、DFS 经典题型 岛屿的最大面积 LeetCode 695描述&#xff1a;求网格中最大的陆地连通区域面积解题&#xff1a;DFS 遍历所有相邻陆地&#xff0c;标记已访问关键点&#…

开发者社区测试报告(功能测试+性能测试)

功能测试 测试相关用例 开发者社区功能背景 在当今数字化时代&#xff0c;编程已经成为一项核心技能&#xff0c;越来越多的人开始学习编程&#xff0c;以适应快速变化的科技 环境。基于这一需求&#xff0c;我设计开发了一个类似博客的论坛系统&#xff0c;专注于方便程序员…

pyecharts 中设置 ​Map 图表的宽高

在 pyecharts 中设置 ​Map 图表的宽高&#xff0c;需要通过 InitOpts 初始化参数实现。以下是具体方法&#xff1a; &#x1f3af; 完整代码示例 from pyecharts import options as opts from pyecharts.charts import Map# 创建地图时设置宽高 map_chart (Map(init_optsopt…

FPGA|Verilog-SPI驱动

最近准备蓝桥杯FPGA的竞赛&#xff0c;因为感觉官方出的IIC的驱动代码思路非常好&#xff0c;写的内容非常有逻辑并且规范。也想学习一下SPI的协议&#xff0c;所以准备自己照着写一下。直到我打开他们给出的SPI底层驱动&#xff0c;我整个人傻眼了&#xff0c;我只能说&#x…

python语言总结(持续更新)

本文主要是总结各函数&#xff0c;简单的函数不会给予示例&#xff0c;如果在平日遇到一些新类型将会添加 基础知识 输入与输出 print([要输出的内容])输出函数 input([提示内容]如果输入提示内容会在交互界面显示&#xff0c;用以提示用户)输入函数 注释 # 单行注释符&…

NO.26十六届蓝桥杯备战|字符数组七道练习|islower|isupper|tolower|toupper|strstr(C++)

P5733 【深基6.例1】自动修正 - 洛谷 小写字母 - 32 大写字母 大写字母 32 小写字母 #include <bits/stdc.h> using namespace std;const int N 110; char a[N] { 0 };int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cin >> a;int i 0;while (a…

笔记四:C语言中的文件和文件操作

Faye&#xff1a;只要有正确的伴奏&#xff0c;什么都能变成好旋律。 ---------《寻找天堂》 目录 一、文件介绍 1.1程序文件 1.2 数据文件 1.3 文件名 二、文件的打开和关闭 2.1 文件指针 2.2.文件的打开和关闭 2.3 文件读取结束的判定 三、 文件的顺序读写 3.1 顺序读写…

DeepSeek进阶应用(一):结合Mermaid绘图(流程图、时序图、类图、状态图、甘特图、饼图)

&#x1f31f;前言: 在软件开发、项目管理和系统设计等领域&#xff0c;图表是表达复杂信息的有效工具。随着AI助手如DeepSeek的普及&#xff0c;我们现在可以更轻松地创建各种专业图表。 名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&…

【OneAPI】网页截图API-V2

API简介 生成指定URL的网页截图或缩略图。 旧版本请参考&#xff1a;网页截图 V2版本新增全屏截图、带壳截图等功能&#xff0c;并修复了一些已知问题。 全屏截图&#xff1a; 支持全屏截图&#xff0c;通过设置fullscreentrue来支持全屏截图。全屏模式下&#xff0c;系统…

基于SpringBoot的餐厅点餐管理系统设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

Windows Server 2022:赋能未来,打造智能高效的企业数字基座---免费下载

免费下载地址 Windows Server 2022&#xff1a;赋能未来&#xff0c;打造智能高效的企业数字基座‌ 在数字化转型的浪潮中&#xff0c;企业需要更安全、更灵活、更智能的基础设施支撑。‌Windows Server 2022‌作为微软新一代服务器操作系统&#xff0c;以革新性的技术架构和行…

支持向量简要理解

决策方程符合感知机区分理论&#xff0c;我们基于线性代数来看这满足子空间理论&#xff0c;可以获取得到超平面。 支持向量机的目标是寻找最与超平面最近的点的最大距离&#xff0c;而距离计算如上&#xff0c;符合数学上计算点到线&#xff08;面&#xff09;的距离公式。 …

USB2.0 学习(1)字段和包

目录 1 字段 1.1 包识别字段PID 1.2 地址字段 1.3帧号字段 1.4 数据字段 1.5 CRC字段 2 包 2.1令牌包 2.2帧起始包 2.3数据包 2.4SPLIT包(分割事务包) 2.5握手包 参考 USB包的构成是一个逐层的过程,首先这些串行数据按照特定的规则构成字段,字段是构成包的基本…

AI 人工智能深度解析:从基础到前沿,全面掌握未来科技

AI 人工智能深度解析&#xff1a;从基础到前沿&#xff0c;全面掌握未来科技 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 文章目录 AI 人工智能深度解析…

2025-03-09 学习记录--C/C++-PTA 习题11-1 输出月份英文名

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 裁判测试程序样例&#xff1a; #include <stdio.h>char *getmonth( int n );int main() {int n;char …

【音视频 | AAC】AAC编码库faac介绍、使用步骤、例子代码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

macos 程序 运行

sudo xattr -r -d com.apple.quarantine [/Applications/Name]使用stow 管理配置文件

JavaWeb后端基础(7)AOP

AOP是Spring框架的核心之一&#xff0c;那什么是AOP&#xff1f;AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;其实说白了&#xff0c;面向切面编程就是面向特定方法编程。AOP是一种思想&#xff0c;而在Spring框…

STM32驱动OLED屏幕全解析:从原理到温度显示实战(上) | 零基础入门STM32第五十三步

主题内容教学目的/扩展视频OLED显示屏重点课程电路原理&#xff0c;手册分析&#xff0c;驱动程序。初始化&#xff0c;清屏&#xff0c;ASCII字库&#xff0c;显示分区。调用显示函数。做带有加入图形和汉字显示的RTC时钟界面。讲字库的设计原理。 师从洋桃电子&#xff0c;杜…