C到C++入门基础知识
一:命名空间:namespace
(一):命名空间的定义
注:命名空间只能定义在全局,不能定义在函数内部。
(1)类似于C语言的结构体,C语言的命名空间定义为:
namespace name{ // name是命名空间的名字
//
}
(2)命名空间里成员可以是:变量/函数/自定义类型变量/类,等。
namespace xs {int age;char name[10];int ID;struct xs{int height;char* hobies;};void swap(int* num1,int*num2){int tmp = *num1;*num1 = *num2;*num2 = tmp;}
};
(3)命名空间可以嵌套定义:
namespace xs {int age;char name[10];int ID;struct xs{int height;char* hobies;};void swap(int* num1,int*num2){int tmp = *num1;*num1 = *num2;*num2 = tmp;}// 嵌套一个老师的命名空间namespace teacher {char* subject;int work_year;char* name;}
};
(4)在不同文件中定义同一个名字相同的命名空间会被编译器识别为同一个命名空间:
例如同一个项目中分别有两个.cpp文件,两个文件都有xs这命名空间,在编译的时候不会报错,编译器会将他们识别为同一个命名空间。
(5)C++的标准库的命名空间是std(standard).
(二):命名空间的使用
我们在命名空间中定义了变量,函数,类或者结构体等,如果我们没有解析命名空间,像C语言一样使用命名空间的对象和方法时会报错:
namespace xs {int age;char name[10];int ID;struct xs{int height;char* hobies;};void swap(int* num1,int*num2){int tmp = *num1;*num1 = *num2;*num2 = tmp;}namespace teacher {char* subject;int work_year;char* name;}
};int main()
{int a = 1;int b = 2;swap(&a, &b);return 0;
}
在使用命名空间域内定义的变量的时候有以下几种方法:
(1)指定命名空间访问:
::
符号被称为作用域解析运算符
#include <stdio.h>namespace xs {int age;char name[10];int ID;struct xs{int height;char* hobies;};void swap(int* num1,int*num2){int tmp = *num1;*num1 = *num2;*num2 = tmp;}namespace teacher {char* subject;int work_year;char* name;}
};int main()
{int a = 1;int b = 2;// 这里指定xs这个命名空间域xs::swap(&a, &b);printf("a = %d \nb = %d", a, b);return 0;
}
(2)使用using关键字将命名空间中的某个成员展开
#include <stdio.h>namespace xs {int age;char name[10];int ID;struct xs{int height;char* hobies;};void swap(int* num1,int*num2){int tmp = *num1;*num1 = *num2;*num2 = tmp;}namespace teacher {char* subject;int work_year;char* name;}
};// 展开xs中的swap函数
using xs::swap;
int main()
{int a = 1;int b = 2;// 这里我们去掉xs::不会报错swap(&a, &b);printf("a = %d \nb = %d", a, b);return 0;
}
(3)使用using关键字展开命名空间中的全部成员:这种方式容易产生命名冲突等问题
#include <stdio.h>namespace xs {int age = 10;char name[10] = "小明";int ID;struct _xs{int height;char* hobies;};void swap(int* num1,int*num2){int tmp = *num1;*num1 = *num2;*num2 = tmp;}namespace _teacher {char* subject;int work_year;char* name;}
};// 展开命名空间中的全部成员,可以不用域解析::就可以随便访问命名空间内的所有成员了
using namespace xs;
int main()
{printf("age:%d\n name:%s", age, name);return 0;
}
(三):为什么要使用命名空间
(1).解决C语言命名冲突问题
(2).命名空间的本质是开出一个独立的域空间,C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
二:输入输出:cout / cin
说明:cout和cin是c++的标准输入输出类的对象,他们是标准库<iostream>中定义的,用于窄字符(narrowcharacters(oftypechar))的输入输出。
(1)同C语言相比cout和cin不需要格式化,他们支持任意类型的输入输出,会自动将其他类型转换成字符串类型
(2)cout/cin/(换行endl)等都被定义于C++标准库<iostream>,因为C++标准库都放在std(standard)的命名空间中,所以使用的时候要解析命名空间。
(3)有些编译器<iostream>会间接包含printf和scanf函数,也就是说不包含<stdio.h>头文件也可以使用这两函数。
#include <iostream>using namespace std;int main()
{int age;char name[10];cin >> age >> name;// 这里没有包含<stdio.h>printf也可以正常使用printf("age:%d\tname:%s\n", age, name);cout << age << endl;cout << name << endl;return 0;
}
三:缺省参数
定义:在定义函数的时候给予参数一个默认的缺省值。
(1)半缺省,全缺省。
半缺省:部分形参给予默认值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
全缺省:全部形参给予默认值。
(2)带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。
(3)含缺省参数的函数调用的时候,没有传参使用默认值,传参使用传递值。
#include <iostream>// 半缺省
int Add1(int b, int c, int a = 0)
{return a + b + c;
}// 全缺省
int Add2(int a = 0, int b = 0)
{return a + b;
}using namespace std;int main()
{int n1 = 2;int n2 = 3;cout << Add1(n1,n2) << endl;// 全缺省的cout << Add2() << endl;return 0;
}
(4)函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。
我们将.c文件的两个函数声明放到,h文件.c文件依然给缺省值
编译器报错:
所以应该将.c文件中的缺省参数去掉
四:内联函数:inline
使用inline关键字修饰的函数被调用时会在调用处将函数定义展开
(1)加上inline的函数,如果函数代码较多或者是递归,编译器会忽视不展开代码。
(2)使用inline的本质是替换函数调用,提高程序执行的效率(因为函数调用需要建立函数栈帧,开辟空间等消耗),可以平替C语言的宏。
(3)inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错
使用inline,直接在函数的前面加个inline就可以了。
inline int add(int a, int b)
{return a + b;
}
五:函数重载
函数重载:即同名函数,提现了类的多态行为。
满足函数重载的条件:
1.函数的形参不同
2.函数的参数个数不同
3.形参的类型不同
4.形参类型顺序不同
// 函数的形参不同以及形参个数不同
int add(int a, int b,int c = 1)
{return a + b;
}
double add(double a, double b, int c = 1)
{return a + b + c;
}// 形参不同和形参类型顺序不同
void func(char c, int n)
{cout << c << " " << n << endl;printf("形参不同\n");}void func(int n, char c)
{cout << c << " " << n << endl;printf("形参类型顺序不同\n");
}int main()
{// 名字一样调用的是两个函数func('a', 4);func(4, 'a');cout << add(1, 2) << endl;cout << add(1.0, 2.0, 3) << endl;return 0;
}
但是返回值不同不可以
六:引用
(一)引用的定义和特性
(1)引用就是给一个对象起别名,不开辟内存空间。
其基本格式为:类型& 引⽤别名 = 引⽤对象; (这里的&不是取地址)
#include <iostream>
using namespace std;int main()
{int a = 0;int c = 5;int& ra = a;int& rc = c;// 对引用进行++ra++;rc++;cout << "ra++后a:" << a << endl;cout << "rc++后c:" << c << endl;cout << "ra的地址为:" << &ra << endl;cout << "a的地址为:" << &a << endl;cout << "rc的地址为:" << &rc << endl;cout << "c的地址为:" << &c << endl;return 0;
}
(2)引用定义的时候必须要初始化:看吧。
(3)⼀个变量可以有多个引⽤:跟一个人有多个绰号差不多
#include <iostream>
using namespace std;int main()
{int a = 0;int c = 5;int& ra = a;int& rra = a;int& rc = c;return 0;
}
(4)引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体:
(5)引用可以引用引用;
int a = 0;int& ra = a;// 这样是可以的
int& rra = ra;
(二)引用的使用
(1)引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被引⽤对象
例如在函数传参的时候
void fun(int& x)
{x++;
}int main()
{int a = 0;fun(a);// 这里相当于将a取了一个别名,然后函数里面根据这个别名找到对应的对象进行运算cout << a << endl;return 0;
}
(三)const修饰引用
(1)const修饰引用可以使权限缩小,但是不能使权限放大,当然const修饰的应用对象是不能被修改的。
// 定义一个变量
const int a = 8;// 权限放大,不允许,会报错的
int& ra = a;// 权限平替,这样可以
const int& ra = a;int b = 0;
// 权限缩小
int& rb = b;
// 不允许
rb++;
// 允许
b++;// 权限缩小只是缩小引用的权限缩小,而不会影响引用的对象的权限。
(2)引用可以引用临时对象:
临时对象:在程序运行中产生的用于转换的值或者其他对象,例如:类型转换,函数传参(函数传参是临时拷贝,传地址就不会产生临时对象)。这期间就会产生临时对象。
临时对象具有常性:
void fun(int& x)
{x++;
}void fun2(int x)
{int& rx = x;x++;cout << rx << endl; // 这输出3
}int main()
{int a = 0;fun(a);// 这里相当于将a取了一个别名,然后函数里面根据这个别名找到对应的对象进行运算cout << a << endl;const int n = 2;int rn = n;n++; // 这里不允许// 这里int向double转换的时候产生了临时变量,权限被放大了。const double& rm = n * 3;// n是const修饰的变量,传递给函数,传递的是它的一份临时拷贝fun2(n);cout << rm << endl; // 这里输出6return 0;
}
(四)指针和引用的区别
(1)指针需要开辟空间,指针变量存储的是空间的地址。引用不需要开空间,他是所引用对象的另一个别名。
(2)引用定义的时候就必须要初始化,指针可以不用
int& r;// 指针不初始化没问题,编译器不会初始化,但是这样就成了野指针,不建议这样搞
int* ptr;
(3)指针容易出现空指针和野指针,引用不容易出现空引用,引用比指针更安全。
空引用:
(4)引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
(5)引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
int main()
{int a = 0;int& b = a;int d = 5;b = d;int* p = &a;cout << p << endl;p = &d;cout << p << endl;cout << "a和b的地址" << endl;cout << &a << endl;cout << &b << endl;return 0;
}
(6)sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
七:nullptr和NULL的区别
NULL在C++中被定义为了宏0,容易导致和整型的0混淆使用,而nullptr不会出现这种情况,C语言支持NULL不支持nullptr。C++都支持。
int main()
{// 这里明着给int类型的a赋值指针但是没报错int a = NULL;printf("%d", a);return 0;
}
相关文章:

C到C++入门基础知识
一:命名空间:namespace (一):命名空间的定义 注:命名空间只能定义在全局,不能定义在函数内部。 (1)类似于C语言的结构体,C语言的命名空间定义为࿱…...

Aigtek功率放大器的主要参数有什么
功率放大器是一种电子设备,通常用于放大输入信号的功率。为了评估和描述功率放大器的性能,有一些主要参数需要了解。下面将介绍一些常见的功率放大器参数。 增益:功率放大器的增益是指输出功率与输入功率之间的比值。它表示了信号经过放大器后…...

运维工程师概述及职责
运维工程师 运维运维工程师(Operations Engineer 或 System Administrator)是负责确保计算机系统、服务器、网络、存储设备等基础设施稳定运行的专业人员。 运维工程师在IT行业中扮演着至关重要的角色,是连接开发团队和业务团队的桥梁&#…...

Android系统dumpsys命令详解
文章目录 1. dumpsys 的工作原理2. 基本使用方法执行 dumpsys限制 dumpsys 的输出 3. 常见的 dumpsys 服务1. Activity Manager (activity)2. Battery Service (battery)3. Window Manager (window)4. Package Manager (package)5. Power Manager (power)6. Media DRM (media.d…...

[Unity Demo]从零开始制作空洞骑士Hollow Knight第二集:通过InControl插件实现绑定玩家输入以及制作小骑士移动空闲动画
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、通过InControl插件实现绑定玩家输入二、制作小骑士移动和空闲动画 1.制作动画2.玩家移动和翻转图像3.状态机思想实现动画切换总结 前言 好久没来CSDN看看&…...

基于鸿蒙API10的RTSP播放器(七:亮度调节功能测试)
目标: 当我的手指在设备左方进行上下移动的时候,可以进行屏幕亮度的调节,在调节的同时,有实时的调节进度条显示 步骤: 界面逻辑:使用Stack() 组件,完成音量图标和进度条的组合显示,…...

基于SpringBoot+Vue的校内跑腿业务管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…...

嵌入式鸿蒙系统开发语言与开发方法分析
大家好,今天主要给大家分享一下,HarmonyOS系统的主力开发语言ArkTS语言开发方法,它是基于TypeScript(简称TS)语言扩展而来。 第一:ArkTS语言基本特性 目的:声明式UI,让开发者以更简洁,更自然的方式开发高性能应用。 声明式 UI基本特性: 基本UI描述:ArkTS定义了各种装饰…...
SpringBoot开发——整合Spring Data MongoDB
文章目录 一、MongoDB简介1、MongoDB是什么2、MongoDB 基本概念(1)文档(2)集合(3)数据库3、MongoDB的系统数据库4、MongoDB数据模型二、SpringBoot整合Spring Data MongoDB1、创建项目,添加Spring Data MongoDB依赖2、创建实体类Student3、创建StudentRepository接口4、创建…...
camouflaged object detection中的decoder最核心的作用
在 camouflaged object detection(COD)任务中,decoder 的确有一个核心作用是进行 上采样 以恢复图像的分辨率,但这并不是它唯一或最核心的作用。我们可以从更广泛的视角来看 decoder 的作用。 1. 上采样(Upsampling&a…...

Java volatile
Volatile 作用:保证变量的可见性,有序性(禁止指令重排序)。不保证原子性。 如何保证可见性的? 场景:每个 线程 下都有一块 工作内存。要使用变量需要从 主内存 中把 变量 读取出来,使用完成后写…...
一条sql是如何执行的详解
一条sql是如何执行的详解 1. SQL 解析(Parsing) 2. 查询重写(Query Rewrite) 3. 查询规划(Query Planning) 4. 查询执行(Query Execution) 5. 结果返回 示例:查询执…...

“先天项目经理圣体”丨超适合做项目经理的4种人
总有人在问,什么样的人适合做项目经理,当项目经理需要什么样的特质? 你别说,还真有那么一些人是“先天项目经理圣体”,天生就是吃项目经理这碗饭的。 沟通达人丨靠“嘴”走天下 我们知道项目经理大部分的时间都在进行…...
如何从object中抽取某几个值,然后转换成数组
可以使用Object.entries(), Array.prototype.filter()和Array.prototype.map()或者解构赋值的方式从对象中抽取某些值并转换为数组 示例 1:使用 Object.entries(), filter() 和 map() const obj {a: 1,b: 2,c: 3,d: 4 };const keysToExtract [a, c];const extr…...

数据结构(14)——哈希表(1)
欢迎来到博主的专栏:数据结构 博主ID:代码小豪 文章目录 哈希表的思想映射方法(哈希函数)除留余数法 哈希表insert闭散列负载因子扩容find和erase 哈希表的思想 在以往的线性表中,查找速度取决于线性表是否有序&#…...
K近邻算法_分类鸢尾花数据集
import numpy as np import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score1.数据预处理 iris load_iris() df pd.DataFrame(datairis.data, columnsiris.featur…...
nacos和eureka的区别详解
Nacos 和 Eureka 都是服务发现和注册中心的解决方案,但它们在功能、设计和使用场景上有所不同。以下是它们的详细区别: 1. 基本概念 Eureka:是由 Netflix 开发的服务发现工具。它主要用于 Java 微服务架构中的服务注册与发现。Eureka 通过 R…...
AI大模型包含哪些些技术?
Prompt Prompt提示是模型接收以生成响应或完成任务的初始文本输入。 我们给AI一组Prompt输入,用于指导模型生成响应以执行任务。这个输入可以是一个问题、一段描述、一组关键词,或任何其他形式的文本,用于引导模型产生特定内容的响应。 Tra…...

分布式技术概览
文章目录 分布式技术1. 分布式数据库(Distributed Databases)2. 分布式文件系统(Distributed File Systems)3. 分布式哈希表(Distributed Hash Tables, DHTs)4. 分布式缓存(Distributed Caching…...

动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习
动手学习RAG: 向量模型动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习动手学习RAG:迟交互模型colbert微调实践 bge-m3 1. 环境准备 pip install transformers pip install open-retrievals注意安装时是pip install open-retrievals,但调用时只…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...