【C++初阶】C++简单入门(长期维护)

news2024/11/30 8:56:37

本篇博客是对C++的一些简单知识分享,有需要借鉴即可。

C++简单入门目录

  • 一、C++前言
    • 1.C++的概念:
    • 2.C++发展历程
    • 3.C++如何学?
  • 二、C++入门
    • 1.C++关键字(C++98标准)
    • 2.命名空间
    • 3.C++输入&输出
      • ①概念说明
      • ②使用说明
      • ③特征说明
      • ④细节拓展
      • ⑤cout与cin的意义
    • 4.缺省参数
      • ①概念说明
      • ②使用规则
      • ③应用举例
      • ④缺省参数的意义
    • 5.函数重载
      • ①概念
    • 6.引用
      • ①概念
      • ②特性
      • 使用场景
        • 1.做参数

一、C++前言

1.C++的概念:

一种高级编程语言,由C发展而来,满足过程化程序设计、基于对象的程序设计、面向对象的程序设计。

2.C++发展历程

在这里插入图片描述
C++最新发展:LINK

3.C++如何学?

  • 写博客总结
  • 定期画思维导图总结
  • 常复习(博客笔记、知乎答案、看书)
  • 刷题

二、C++入门

1.C++关键字(C++98标准)

在这里插入图片描述

2.命名空间

C++命名空间概念:一种命名域、是C++专门用来解决C语言变量命名冲突问题而产生的。
命名空间的意义很大程度上解决C变量命名冲突问题。

知识拓展:C中的命名冲突
命名冲突主要有两大类:

  • 程序员 与 库
    在这里插入图片描述

  • 程序员 与 程序员

知识拓展1:域,C++上指的是作用域LINK
在C++中,大体有四种域:

  • 全局域:生命周期 访问
  • 局部域:生命周期 访问
  • 命名空间域:访问
  • 类域


知识拓展2:编译器对名称的搜索原则:

  • 在不指定域的情况下
  1. 当前域
  2. 全局域
  • 在指定域的情况下
  1. 直接去指定域搜索

命名空间的定义: namespace关键字+命名空间的名字+{…}

  1. 命名空间中可以定义变量/函数/类型
  2. 命名空间可以嵌套
  3. 同一命名空间会被合并
namespace bit
{
 // 命名空间中可以定义变量/函数/类型
 int rand = 10;
 int Add(int left, int right)
 {
 return left + right;
 }
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

命名空间的使用:

  • 法1:指定访问

需要用到访问操作符 ::

  1. 访问变量/函数 命名空间名称 + :: + 变量名/函数名
  2. 访问结构体 struct + 空间名 + :: + 结构体名
  • 法2:直接访问(展开访问)

需要用到指令:using namespace + 空间名 —>等价于把空间内的命名放到全局变量

  • 法3:展开特定项

eg:using std::cout;

在这里插入图片描述

总结:对比指定访问与展开访问,分析其利弊
答:

  • 指定访问 解决变量冲突问题 麻烦
  • 展开访问 直接把变量放到全局中 方便
  • 部分展开 把常用的变量放到全局中 方便
    其中,做项目一般使用第1与第3方式,第2种方法一般在练习中使用。

头文件展开与命名空间展开的区别:
头文件的展开本质是在预处理阶段拷贝头文件内容。
命名空间的展开本质是影响编译器的搜索规则。

3.C++输入&输出

①概念说明

cpp的输入输出分别是cout与cin,这两个函数均包含在iostream头文件中,在使用时需要展开命名空间进行使用。
在这里插入图片描述

②使用说明

#include<iostream>
using namespace std;

int main()
{
	// <<,1.左移
	int a = 10;
	a = a << 1;
	printf("a<<1:%d\n", a);
	// <<,2.流插入
	cout << "hello cpp" << endl;

	// >>,1.右移
	a = a >> 1;
	printf("a>>1:%d\n", a);
	// >>.2.流提取
	cin >> a;
	
	return 0;
}

③特征说明

下面是cout的特征说明示例:cin也是同理

④细节拓展

在这里插入图片描述

⑤cout与cin的意义

弥补了C语言自定义类型输入输出麻烦的问题

4.缺省参数

①概念说明

缺省参数是c++提供的一种在函数缺少传入值的情况下使用默认值的一种参数。

缺省参数分为两类

  • 全缺省参数
    在这里插入图片描述

  • 半缺省参数
    在这里插入图片描述

②使用规则

  • 有实参优先使用,没有实参使用默认参数
    在这里插入图片描述
  • 缺省参数函数传实参时候从左到右依次给值,缺省参数函数形参从右向左依次给默认值
  • 缺省参数不能在声明与定义中同时出现,要优先给函数声明使用缺省
    在这里插入图片描述
  • 缺省值必须是常量值或者全局变量

思考:为什么缺省参数要优先在函数声明中使用?而不是优先给函数定义使用?
答:
我们首先要明白编译器的编译原理,编译器首先要进行预处理,在这一步中展开头文件,之后编译器要进行编译,在这一步中编译器主要是检查语法,通常情况下,这种时候每个源文件都是独立的,每个调用函数的源文件中也自然大概率没有函数的定义,但是已经有了函数声明(因为经过了预处理),所以为了要让编译器不报错,肯定是先让函数声明有缺省参数。


那为什么不直接函数定义也有缺省参数,函数声明也有缺省参数呢?
因为语法是规定只能有一个的。
在这里插入图片描述

③应用举例

在c语言阶段,我们设计一个栈时候往往初始化不知道要给几个空间,这样我们可以给一个缺省参数来默认给值,然后不够了的话扩容。
在这里插入图片描述

④缺省参数的意义

对函数定义更加灵活化。

5.函数重载

①概念

函数名相同,函数参数不同,称为函数重载

函数参数不同在哪里?

  • 参数的类型不同
    在这里插入图片描述
  • 参数的个数不同
    在这里插入图片描述
  • 参数的顺序不同

思考:编译器是如何支持函数重载的?C语言就不行。
答:名称修饰
在这里插入图片描述

6.引用

①概念

引用:底层汇编层面是用指针实现的,但是在语法层面上是为变量起别名,与指针起到互补作用。
在这里插入图片描述

②特性

  1. 引用在定义时必须初始化
    在这里插入图片描述

  2. 引用不能更改指向
    在这里插入图片描述
    在这里插入图片描述

  3. 一个变量可以有多个引用
    在这里插入图片描述

思考:引用可以完全替代指针吗?
答:不能,引用往往是在用指针比较复杂的地方代替指针。
为什么引用不能完全替代指针?
虽然引用可以在大多数情况下替代指针的使用从而简化指针,但是某些情况下是不能用引用解决的。
比如下面这个例子:
现在有一个单链表,要求删除中间的一个结点。
在这里插入图片描述
这里的关键点就在于引用不能改变指向,现在你把中间结点删除了,但是前面结点的指向怎么办?

//例子,链表
typedef int SLTDataType;
typedef struct SListNode
{
	SLTDataType val;
	struct SListNode* next;
}SLNode, * PSLNode;


//指针的方法
void SLPush(SLNode** pphead, SLTDataType x)
{
	assert(pphead);

	SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));
	newnode->next = NULL;
	newnode->val = x;
	
	if (*pphead == NULL)
	{
		*pphead = newnode;
		return;
	}
	else
	{
		SLNode* pcur = *pphead;
		while (pcur->next)
		{
			pcur = pcur->next;
		}
		pcur->next = newnode;
	}
}

//引用的方法
void SLPush(SLNode*& pphead , SLTDataType x)
{
	assert(pphead);

	SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));
	newnode->next = NULL;
	newnode->val = x;
	
	if (pphead == NULL)
	{
		pphead = newnode;
		return;
	}
	else
	{
		SLNode* pcur = pphead;
		while (pcur->next)
		{
			pcur = pcur->next;
		}
		pcur->next = newnode;
	}
}

void SLPrint(SLNode*& phead)
{
	while (phead)
	{
		cout << phead->val << "  ";
		phead = phead->next;
	}
}

void test_3()
{
	SLNode* phead = NULL;
	SLPush(&phead, 1);
	SLPush(phead, 2);
	SLPush(&phead, 3);
	SLPush(phead, 4);
	SLPrint(phead);
}

使用场景

1.做参数
void C_Swap(int* a,int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

void CPP_Swap(int& a2, int& b2)//在这里可以起与实参一样的名字吗?可以。因为属于不同的域。
{
	int temp = a;
	a = b;
	b = temp;
}

void test_1()
{
	int a1 = 10;
	int b1 = 20;
	printf("a1 = %d , b1 = %d\n", a1, b1);
	C_Swap(&a1,&b1);
	printf("a1 = %d , b1 = %d\n", a1, b1);

	int a2 = 10;
	int b2 = 20;
	cout << "a2 = " << a2 << " b2 = " << b2 << endl;
	CPP_Swap(a2, b2);
	cout << "a2 = " << a2 << " b2 = " << b2 << endl;
}

思考:在这里可以起与实参一样的名字吗?
答:可以,因为属于不同的域。


待续。

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

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

相关文章

【24年软考】系统架构设计师论文写作技巧(附范文10篇)

1.快速审题 写作文要先审题&#xff0c;架构师论文命题也是如此。论文命题除了确定题目之外&#xff0c;还会给你写作要求。而这个写作要求会告诉你本命题涉及的知识点有哪些&#xff0c;并给你确立一个写作向。这个可以参考后面的论文真题分析。 2.确定题目 在填写并确认好…

MATLAB有限元结构动力学分析与工程应用-徐斌|【PDF电子书+配套Matlab源码】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

wsl 2在windows11上的设置

详细参考&#xff1a;Manual installation steps for older versions of WSL | Microsoft Learn 1.系统组件要打开 分别是&#xff1a;Hyper-V、虚拟机平台、适用于Windows的Linux子系统 2.以管理员方式运行命令行&#xff0c;逐步执行下面的命令 update to WSL 2, you must…

篮球竞赛|基于Springboot的篮球竞赛预约平台系统设计与实现(源码+数据库+文档)

篮球竞赛预约平台目录 基于Springboot的篮球竞赛预约平台系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台&#xff1a; 2、后台 管理员功能 用户功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff…

llama-factory SFT系列教程 (一),大模型 API 部署与使用

文章目录 背景简介难点 前置条件1. 大模型 api 部署下一步阅读 背景 本来今天没有计划学 llama-factory&#xff0c;逐步跟着github的文档走&#xff0c;发现这框架确实挺方便&#xff0c;逐渐掌握了一些。 最近想使用 SFT 微调大模型&#xff0c;llama-factory 是使用非常广泛…

主从数据同步原理

2.2.主从数据同步原理 2.2.1.全量同步 主从第一次建立连接时&#xff0c;会执行全量同步&#xff0c;将master节点的所有数据都拷贝给slave节点&#xff0c;流程&#xff1a; 这里有一个问题&#xff0c;master如何得知salve是第一次来连接呢&#xff1f;&#xff1f; 有几个…

添加索引真的不会锁表吗

1.MySQL DDL执行方式 MySQL5.5以及之前的版本&#xff0c;通常更改数据表结构操作(DDL)会阻塞对表数据的增删改操作(DML)。 MySQL5.6提供Online DDL之后可支持DDL与DML操作同时执行&#xff0c;降低了DDL期间对业务延迟带来的影响。 2.Online ddl&#xff1a; 概念&#xff…

Innodb架构解析

整体架构 通过《面试官&#xff1a;一条SQL是如何执行的&#xff1f;》我们了解了MySQL架构&#xff0c;下面我们看下Innodb架构。 innodb最早由Innobase Oy公司开发&#xff0c;5.5版本开始是MySQL默认存储引擎&#xff0c;该存储引擎是第一个完整支持ACID事务的MySQL存储引…

多线程GUI界面文件复制程序的解决方案

在Python中&#xff0c;你可以使用多线程来编写一个GUI界面的文件复制程序。这样可以使得文件复制过程在后台进行&#xff0c;而不会阻塞用户界面&#xff0c;提升用户体验。下面是一个使用Python的Tkinter库和多线程实现的文件复制程序的示例&#xff1a; 1、问题背景 我们有…

Mac上的最佳3D建模工具-犀牛Rhinoceros 8 for Mac v8.6.24101.05002完美兼容激活

Rhino 8是一款计算机辅助设计&#xff08;CAD&#xff09;和三维建模软件&#xff0c;由美国公司McNeel & Associates开发。它是Rhino系列的最新版本&#xff0c;用于创建、编辑、分析、渲染和动画三维模型。 以下是Rhino 8的一些主要特点和功能&#xff1a; 1. **强大的…

今天讲讲MYSQL数据库事务怎么实现的!

目录 什么是数据库事务 Mysql如何保证原子性 Mysql如何保证持久性 MySQL怎么保证隔离性 事务隔离级别 脏读的解决 不可重复读的解决 幻读的解决 MVCC实现 Read View 那么RC、RR级别下的InnoDB快照读有什么不同&#xff1f; 什么是数据库事务 数据库事务是指一组数据…

2024年4月12日 十二生肖 今日运势

小运播报&#xff1a;2024年4月12日&#xff0c;星期五&#xff0c;农历三月初四 &#xff08;甲辰年戊辰月丙午日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;羊、狗、虎 需要注意&#xff1a;牛、马、鼠 喜神方位&#xff1a;西南方 财神方位&#xff1a;…

强化学习-深度蒙特卡洛算法(Deep Monte-Carlo)解决骰子游戏“吹牛”

一、算法简介 深度蒙特卡洛算法是一种使用深度神经网络来进行蒙特卡洛估计的强化学习算法&#xff0c;它最早于2020年在《DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning》被提出用于解决斗地主问题。 深度蒙特卡洛算法使用深度网络拟合每个时刻&…

HarmonyOS 开发-阻塞事件冒泡

介绍 本示例主要介绍在点击事件中&#xff0c;子组件enabled属性设置为false的时候&#xff0c;如何解决点击子组件模块区域会触发父组件的点击事件问题&#xff1b;以及触摸事件中当子组件触发触摸事件的时候&#xff0c;父组件如果设置触摸事件的话&#xff0c;如何解决父组…

应对人工智能在金融服务业的迅猛发展

今天分享的是人工智能专题系列深度研究报告&#xff1a;《人工智能专题&#xff1a;应对人工智能在金融服务业的迅猛发展》。 &#xff08;报告出品方&#xff1a;安永&#xff09; 评估人工智能对金融服务业的潜在影响 虽然大型银行和保险公司使用人工智能已有多年&#xf…

Rust语言入门第一篇-环境搭建

Rust语言入门第一篇 Rust官网 一&#xff0c;环境搭建 1、C开发环境配置 Rust 语言的底层是依赖于 C/C 编译器的。在安装 Rust 编译器时&#xff0c;通常会自动安装所需的 C/C 编译环境&#xff0c;以便 Rust 能够生成可执行文件或库。因此&#xff0c;在安装 Rust 之前&…

牛客NC413 两个升序数组的中位数【hard 数组,模拟 Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/b3b59248e61f499482eaba636305474b 思路 直接模拟2个数组有顺序放到一个数组中help中如果help长度为奇数&#xff0c;返回中间的数如果help长度为偶数&#xff0c;返回中间2个数的和除以2参考答案java import j…

【学习】移动端兼容性测试有什么方法及重要性

随着移动互联网的快速发展&#xff0c;移动应用程序已经成为人们日常生活中不可或缺的一部分。然而&#xff0c;由于各种移动设备的硬件和软件差异&#xff0c;移动应用程序的兼容性问题也越来越突出。因此&#xff0c;移动端兼容性测试成为了一个重要的环节&#xff0c;它可以…

jar包瘦身 移除无用的maven依赖

1.进入pom.xml所在目录&#xff0c;执行mvn dependency:analyze Unused declared dependencies found:下的单个包进行逐个移除编译&#xff0c;编译不报错就可以移除

3d怎么按路径制作模型---模大狮模型网

在3D建模中&#xff0c;按路径制作模型是一种常见的技术&#xff0c;特别适用于创建曲线、管道、绳索等线性形状的物体。虽然这项技术可能对初学者来说有些复杂&#xff0c;但通过一步步的指导和实践&#xff0c;你将能够掌握它。本文将详细介绍按路径制作模型的步骤&#xff0…