C++初探究

news2024/9/20 20:27:10

概述

C++可以追溯到1979年,C++之父Bjarne Stroustrup在在使用C语言研发工作时发现C语言的不足,并想要将其改进,到1983年,Bjarne Stroustrup在C语言的基础上添加了面向对象编程的特性,设计出了C++的雏形。

网址推荐

C++官方文档(英文):cppreference.com

C++官方文档(中文):C++ 参考手册 - cppreference.com

C++函数查询:Reference - C++ Reference

C++程序

C++兼容C的绝大多数语法,所以我们仍可以在C++文件中使用printf函数

#include <stdio.h>	

int main()
{
	printf("hello world");
	return 0;

}

类似于C的#include <stdio.h>,C++中也有一个标准库. 我们想要调用就要用:#include <iostream>,所以,严格来说用C++写出的printf函数应该是这样写的:
 

#include<iostream>
using namespace std;

//命名冲突->命名空间
int main()
{
	cout << "hello world" << endl;
	return 0;
}

接下来,我们一一讲解代码中的元素.

当需要多人完成一个项目时,若两人用了相同的变量名,但变量的值却不同该怎么办?

namespace命名空间

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

        2.namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。

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

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

        5.项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。

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

namespace的使用

如果写出这样的代码:

int main()

{
	int rand = 10;
	 //编译报错:error C2365: “rand”: 重定义;以前的定义是“函数”
	printf("%p\n", rand);//查找是编译进行的
	return 0;
}

会出现重定义报错

所以我们使用命名空间:

//“ ::”域作用限定符,不写即为先从全局开始查找,也可以写具体的域
namespace Frenemy
{
	int rand = 10;
}
int main()

{
	 //编译报错:error C2365: “rand”: 重定义;以前的定义是“函数”
	printf("%d\n", Frenemy::rand);//查找是编译进行的
	return 0;
}

其中“ ::”域作用限定符,不写即为先从全局开始查找,也可以写具体的域,并且命名空间必须写在全局变量中.

而对于多个文件中的相同的命名空间,C++会直接将其合并.

若在一个项目中,已经使用了一次命名空间,但仍有两人使用相同变量又该怎么办呢?

namespace的嵌套调用

在同一个命名空间中,假如有两人ab与xy,我们就可以使用嵌套定义:

namespace Frenemy
{
	namespace ab
	{
		int rand = 1;
		
	}
	namespace xy

	{
		int rand = 2;
		
	}

我们如果要使用命名空间的值,例如ab里的rand,则使用Frenemy::ab::rand即可

namespace的展开

全部展开:使用using Frenemy(namespace) 

部分展开(只展开一个变量):使用using Frenemy(namespace)::ab::rand.要使用时直接调用rand变量即可.

对于标准库函数standard(简称std), 每次写语句时都要使用std::cout<<a<<std::endl;较为麻烦,所以对于平时小练习可以将标准库函数直接展开.

C++输入输出

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

        
        std::cin 是 istream 类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输⼊流。


        std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流。


        std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。


        <<是流插⼊运算符,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)

        C++一行可以输入输出多个字符和字符串,并且可以自动识别多种类型

c语言中的printf在C++中就相当于输出函数cout.

int main()
{
	printf("hello world!\n");
	cout << "hello world!" << endl;
	return 0;
}//这两者是同一效果

缺省参数

        缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把缺省参数也叫默认参数)

        带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。


        函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。

全缺省参数

全部形参给缺省值,例如:

// 全缺省
void Func1(int a = 10, int b = 20, int c = 30)
{
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl << endl;
}

要调用函数时就可以不用给形参,如果要给形参,则只能按顺序从前往后给且不能跳着给.

半参省参数
// 半缺省
void Func2(int a, int b = 10, int c = 20)
{

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl << endl;
}

半参省参数的规定是从右向左给形参赋值,也不能跳着给.

函数重载

        C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同名函数的。

参数类型不同

        相同函数名的函数其形参类型不同则为函数重载,例如:

// 1、参数类型不同
int Add(int left, int right)
{
    cout << "int Add(int left, int right)" << endl;
    return left + right;
}

double Add(double left, double right)
{
    cout << "double Add(double left, double right)" << endl;
    return left + right;
}
参数个数不同

        相同函数名的函数其形参个数不同则为函数重载,例如:

// 2、参数个数不同
void f(int a, int b)
{
    cout << "f(int a, int b)" << endl;
}

void f(int a)
{
    cout << "f(int a)" << endl;
}
参数类型顺序不同 

        相同函数名的函数其形参顺序不同则为函数重载,例如

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

void f(char b, int a)
{
    cout << "f(char b, int a)" << endl;
}
注意 

        1.需要注意的是,返回值不同并不能说明两函数为函数重载,因为函数返回值可以不被调用;如果其中一个没有返回值,而另一个有,当需要返回值时也无法区分 .

        2.下列函数f()调用时会报错,因为编译器不知道执行哪一个!

// 下⾯两个函数构成重载
// f()但是调⽤时,会报错,存在歧义,编译器不知道调⽤谁
void f1()
{
    cout << "f()" << endl;
}

void f1(int a = 10)
{
    cout << "f(int a)" << endl;
}

引用

         引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间,它和它引⽤的变量共⽤同⼀块内存空间。我们可以粗浅的将其理解为没有开辟新空间的指针.

引用的特性

        1.引⽤在定义时必须初始化


        2.⼀个变量可以有多个引用


        3.引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体

例如

int main()
{
	int a = 0;
	// 引⽤:b和c是a的别名,放在类型后面就是引用,别名相当于指针,但别名的地址与原变量相同
	int& b = a;
	int& c = a;
	// 也可以给别名b取别名,d相当于还是a的别名
	int& d = b;
	//这⾥取地址我们看到是⼀样的
	++d;
	
	cout << &a << endl;
	cout << &b << endl;
	cout << &c << endl;
	cout << &d << endl;
	return 0;
}

相当于为变量取外号 .

例如我们熟悉的Swap函数,用指针写是这样:

void Swap(int* rx, int* ry)
{
	int tmp = *rx;
	*rx = *ry;
	*ry = tmp;
}

用引用写是这样:

void Swap(int& rx, int& ry)
{
	int tmp = rx;
	rx = ry;
	ry = tmp;
}

看起来确实简洁一点, 这些就是引用的一些基础知识。

总结

学会这几个知识点,我们就可以理解开篇的那个函数代表了什么意思了。

C++中许多新语法的提出,其实也就是Bjarne Stroustrup对C语言一些语法的不满并对其进行的改造。我们可以发现,这几个知识点确实对应着C语言语法里一些较为不方便的地方。

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

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

相关文章

C++继承(一文说懂)

目录 一&#xff1a; &#x1f525;继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1 定义格式1.2.2 继承关系和访问限定符1.2.3 继承基类成员访问方式的变化 二&#xff1a;&#x1f525;基类和派生类对象赋值转换三&#xff1a;&#x1f525;继承中的作用域四&#xff1a;&a…

太多项会毁了回归

「AI秘籍」系列课程&#xff1a; 人工智能应用数学基础 人工智能Python基础 人工智能基础核心知识 人工智能BI核心知识 人工智能CV核心知识 多项式回归的过度拟合及其避免方法 通过添加现有特征的幂&#xff0c;多项式回归可以帮助你充分利用数据集。它允许我们甚至使用简…

Java学习高级二

Java是单继承的 Object类 方法重写 Java子类访问 – 就近原则 子类构造器的特点 多态 Java–final

【豆包AI】北京春田知韵

看到有国内AI上线了&#xff0c;网络信息那么多&#xff0c;我该怎么找它的官网呢&#xff1f; 找官方网站3步 1百度 关于抖音豆包的网站是哪个?【www.doubao.com】 豆包属于哪个公司&#xff1f;【北京春田知韵科技有限公司】 www.doubao.com 2查询备案号 PC版本的安装…

理解算法复杂度:时间复杂度详解

引言 在计算机科学中&#xff0c;算法复杂度是衡量算法效率的重要指标。时间复杂度和空间复杂度是算法复杂度的两个主要方面。在这篇博客中&#xff0c;我们将深入探讨时间复杂度&#xff0c;了解其定义、常见类型以及如何进行分析。 什么是时间复杂度&#xff1f; 时间复杂度…

论文《Generalizable Adversarial Attacks Using Generative Models》笔记

【DAGAER】传统的攻击方法依赖于约束优化范式&#xff0c;具有局限性&#xff0c;例如经典的Nettack攻击方法。本文提出了一个统一的白盒对抗攻击生成框架&#xff0c;该方法学习了目标域的深度生成模型&#xff0c;不是在原始输入空间中生成对抗性例子&#xff0c;而是学习在一…

elk在宝塔中的简单部署和使用

ELK是什么&#xff1f;了解elk “ELK” 是 Elasticsearch、Logstash 和 Kibana 三个开源软件的首字母缩写。这三个软件一起常被称为 “ELK Stack” 或 “Elastic Stack”。它们主要用于日志管理和分析&#xff0c;提供了强大的数据搜索、分析和可视化功能。 Elasticsearch&am…

C++初阶学习第一弹——入门学习C++

目录 1.什么是C 2.C关键字 3.命名空间 3.1命名空间的定义 3.2命名空间的使用 1、加命名空间名称及作用域限定符 2、使用 using 将命名空间中某个成员引入 3.使用using namespace 命名空间名称 引入 4.C输入&输出 5.缺省参数 5.1 缺省参数概念 5.2缺省参数分类 6. …

Dungeonborne卡顿延迟怎么办?这样降低Dungeonborne延迟

Dungeonborne将第一人称的动作的即时性和经典的西幻RPG职业设计深度结合&#xff0c;带来无与伦比的游戏体验。玩家在游戏中扮演一位从神秘地牢中醒来的勇士&#xff0c;他必须面对各种未知的敌人和挑战&#xff0c;逐渐揭开自己的身世之谜。在这个充满魔法和奇迹的世界里&…

【计算机毕业设计】015基于weixin小程序校园防疫

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

基于MATLAB的PEF湍流风场生成器模拟与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MATLAB的PEF湍流风场生成器模拟与仿真。PEF&#xff08;Primitive Equations Formulation&#xff09;湍流风场模型&#xff0c;是大气科学和气象学中用来描述大气流动和气…

WebOffice在线编微软Offfice,并以二进制流的形式打开Word文档

在日常办公场景中&#xff0c;我们经常会遇到这种场景&#xff1a;我们的合同管理系统的各种Word,excel,ppt数据都是以二进制数组的形式存储在数据库中&#xff0c;如何从数据库中读取二进制数据&#xff0c;以二进制数据作为参数&#xff0c;然后加载到浏览器的Office窗口&…

【已解决】腾讯云安装了redis,但是本地访问不到,连接不上

汇总了我踩过的所有问题。 查看配置文件redis.conf 1、把bind 127.0.0.1给注释掉&#xff08;前面加个#就是&#xff09;或者改成bind 0.0.0.0&#xff0c;因为刚下载时它是默认只让本地访问。&#xff08;linux查找文档里的内容可以输入/后面加需要匹配的内容&#xff0c;然后…

2024人工智能大会_强化学习论坛相关记录

求解大规模数学优化问题 规划也称为优化 四要素&#xff1a;数据、变量、目标、约束 将一个简单的数学规划问题项gpt进行提问&#xff0c;GPT给了一个近似解&#xff0c;但不是确切的解。 大模型的训练本身就是一个优化问题。 大模型是如何训练的&#xff1f;大模型训练通常使…

Unity通过NDK实现C#与C++之间的相互调用

由于一些历史遗留问题&#xff0c;我们项目还在使用一套C实现的Box2D定点数的库&#xff0c;由于最近修改了视野算法所以需要重新打包安卓的【.so】文件&#xff0c;特此记录 1、关于NDK 在Android平台&#xff0c;C/C需通过NDK编译成动态链接库.so文件&#xff0c;然后C#中通过…

MATLAB基础应用精讲-【数模应用】分层聚类(附python代码实现)

目录 前言 知识储备 层次聚类 1. 算法解读: 2. 步骤和细节: 3. 举例: 4. 算法评价: 5. 算法的变体: 算法原理 基本思想 分层聚类网络的原理 分层聚类网络的优势 分层聚类网络的应用领域 SPSSAU 分层聚类案例 1、背景 2、理论 3、操作 4、SPSSAU输出结果…

STM32智能机器人导航系统教程

目录 引言环境准备智能机器人导航系统基础代码实现&#xff1a;实现智能机器人导航系统 4.1 数据采集模块 4.2 数据处理与导航算法 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;机器人导航应用与优化问题解决方案与优化收尾与总结 1. 引言 智能机器…

如何找到关于目标检测小论文的创新点

深度学习目标检测的小论文创新点 数据集预处理创新 主要包括图像增强、图像去雾、图像融合和图像降噪 例子: 比如在研究方向是检测晚上或者天气不好时骑电动车的人是否佩戴了安全头盔。一般的检测可能只能检测到正常天气情况下的骑电动车的人&#xff0c;而对于大雾天气和晚上…

LT7911UX 国产原装 一拖三 edp 转LVDS 可旋转 可缩放

2.一般说明 该LT7911UX是一种高性能Type-C/DP1.4a到MIPI或LVDS芯片的VR/显示应用。HDCP RX作为HDCP转发器的上游&#xff0c;可以与其他芯片的HDCP TX配合实现转发器功能。 对于DP1.4a输入&#xff0c;LT7911UX可配置为1/2/4通道。自适应均衡使其适用于长电缆应用&#xff0c;最…

基于单片机的空调控制器的设计

摘 要 &#xff1a; 以单片机为核心的空调控制器因其体积小 、 成本低 、 功能强 、 简便易行而得到广泛应用 。 本设计通过 &#xff21;&#xff34;&#xff18;&#xff19;&#xff33;&#xff15;&#xff12; 控制&#xff24;&#xff33;&#xff11;&#xff18;&a…