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语言,还是由很多需要管制与在意的地方,那就先这样吧

全文终

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能机器人学习机WT3000A AI芯片方案-自然语音交互 打造沉浸式学习体验

一、概述 当AI浪潮席卷全球&#xff0c;教育领域也未能幸免。AI学习机&#xff0c;这个打着“个性化学习”、“精准提分”旗号的新兴产品&#xff0c;正以惊人的速度占领市场。从一线城市到偏远乡镇&#xff0c;从学龄前儿童到高考备考生&#xff0c;AI学习机的广告铺天盖地&am…

字符串相乘——力扣

给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2", num2 "3" …

C/C++蓝桥杯算法真题打卡(Day3)

一、P8598 [蓝桥杯 2013 省 AB] 错误票据 - 洛谷 算法代码&#xff1a; #include<bits/stdc.h> using namespace std;int main() {int N;cin >> N; // 读取数据行数unordered_map<int, int> idCount; // 用于统计每个ID出现的次数vector<int> ids; …

关于OceanBase与CDH适配的经验分享

CDH是Cloudera早期推出的一个开源平台版本&#xff0c;它实质上成为了Apache Hadoop生态系统内公认的安装与管理平台&#xff0c;专为企业级需求量身打造。CDH为用户提供了即装即用的企业级解决方案。通过整合Hadoop与另外十多项关键开源项目&#xff0c;Cloudera构建了一个功能…

【CSS3】筑基篇

目录 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 CSS 三大特性继承性层叠性优先级 背景属性背景色背景图背景图平铺方式背景图位置背景图缩放背景图固定背景复合属性 显示模式显示模式块级元素行内元素行内块元素 转换显示模式 结构伪类选择器结构伪类选择器…

假设检验与置信区间在机器学习中的应用

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 &#x1f4da; 引言 在机器学…

鸿蒙Next-应用检测、安装以及企业内部商店的实现

一、企业内部应用检测和更新升级 A应用检测是否安装B应用 canOpenApp():boolean{ try { let link schB://com.example.test/open; // 替换成你目标应用的link串儿 let canOpen bundleManager.canOpenLink(link); console.log("canOpen:"canOpen…

Locker 是 Godot 的一个开源插件,它提供了一种快速且可扩展的方式来使用不同的策略保存和加载数据,并且具有开箱即用的 JSON 和加密功能。

一、软件介绍 文末提供下载 Locker 插件是在 Godot 4.3 中创建的框架&#xff0c;旨在简化在 Godot 项目中保存、加载和管理数据的过程。该插件的主要目标之一是对用户自定义开放&#xff0c;允许使用不同的用户定义策略来访问数据。并且具有开箱即用的 JSON 和加密功能。 二、…

(更新完)LPZero: Language Model Zero-cost Proxy Search from Zero

LPZero代码 摘要 神经架构搜索 (NAS) 有助于自动执行有效的神经网络搜索&#xff0c;同时需要大量的计算资源&#xff0c;尤其是对于语言模型。零样本 NAS 利用零成本 (ZC) 代理来估计模型性能&#xff0c;从而显着降低计算需求。然而&#xff0c;现有的 ZC 代理严重依赖于深…

Varlens(手机上的单反)Ver.1.9.3 高级版.apk

Varlens 是一款专业级手机摄影软件&#xff0c;旨在通过丰富的功能和高自由度参数调节&#xff0c;让手机拍摄效果媲美微单相机。以下是核心功能总结&#xff1a; 一、核心功能 专业拍摄模式 支持手动/自动/程序模式&#xff0c;可调节ISO、快门速度、EV、白平衡等参数27 提供…

Unity2017打包出来后的场景一片红

bug展示&#xff1a; 解决办法&#xff1a; Edit——Project Settings——Graphics——添加下面这俩Shader(用于UI展示)即可。

VS Code C++ 开发环境配置

VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…

html-表格标签

一、表格标签 1. 表格的主要作用 表格主要用于显示&#xff64;展示数据,因为它可以让数据显示的非常的规整,可读性非常好&#xff61;特别是后台展示数据 的时候,能够熟练运用表格就显得很重要&#xff61;一个清爽简约的表格能够把繁杂的数据表现得很有条理&#xff61; 总…

ROS2-话题学习

强烈推荐教程&#xff1a; 《ROS 2机器人开发从入门到实践》3.2.2订阅小说并合成语音_哔哩哔哩_bilibili 构建功能包 # create package demo_python_pkg ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg 自己写的代码放在./demo_python_pkg/…

Java在小米SU7 Ultra汽车中的技术赋能

目录 一、智能驾驶“大脑”与实时数据 场景一&#xff1a;海量数据的分布式计算 场景二&#xff1a;实时决策的毫秒级响应 场景三&#xff1a;弹性扩展与容错机制 技术隐喻&#xff1a; 二、车载信息系统&#xff08;IVI&#xff09;的交互 场景一&#xff1a;Android Automo…

Oracle RAC配置原理详解:构建高可用与高性能的数据库集群

在现代企业级应用中&#xff0c;数据库的高可用性和高性能是至关重要的。Oracle Real Application Clusters&#xff08;RAC&#xff09;是Oracle数据库提供的一种集群解决方案&#xff0c;能够将多个数据库实例部署在不同的服务器上&#xff0c;实现负载均衡和故障切换&#x…

ESP8266TCP客户端(单连接TCP Client)

单连接TCP Client 电脑作为服务器&#xff0c;8266作为客户端 1.配置WiFi模式 ATCWMODE3 //softAPstation mode 相应&#xff1a;ok 2.连接路由器 ATCWJAP“SSID”&#xff0c;“password” //SSID就是wifi的名字&#xff0c; password WIFI密码 响应&#xff…

【Linux】软硬连接与动静态库

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.软硬连接02.动静态库静态库&#xff08;Static Library&#xff09;动态库&#xff08;Dynamic Library&#xff09; 03.动态库加载 01.软硬连接 我们先看一下它的用法 这个是…

关于Springboot 应配置外移和Maven个性化打包一些做法

期望达到的效果是每次更新服务器端应用只需要更新主程序jar 依赖jar单独分离。配置文件独立存放于文件夹内&#xff0c;更新程序并不会覆盖已有的配置信息。 一、配置外移 1、开发环境外移 做法&#xff1a;在项目同级或者上级创建config文件夹放置配置文件&#xff0c;具体m…

阿里云操作系统控制台——解决服务器磁盘I/O故障

目录 引言 需求介绍 操作系统使用实例 获得的帮助与提升 建议 引言 你的云服务器是否遇到过系统响应变慢、服务超时&#xff0c;或者进程卡顿、磁盘空间不足、系统日志频繁告警的问题&#xff1f;这些情况在日常运维中并不少见&#xff0c;尤其是在 高负载或资源紧张时&a…