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,但调用时只…...

Nacos rce-0day漏洞复现(nacos 2.3.2)
Nacos rce-0day漏洞复现(nacos 2.3.2) NACOS是 一个开源的服务发现、配置管理和服务治理平台,属于阿里巴巴的一款开源产品。影像版本:nacos2.3.2或2.4.0版本指纹:fofa:app“NACOS” 从 Github 官方介绍文档可以看出国…...

yjs04——matplotlib的使用(多个坐标图)
1.多个坐标图与一个图的折线对比 1.引入包;字体(同) import matplotlib.pyplot as plt import random plt.rcParams[font.family] [SimHei] plt.rcParams[axes.unicode_minus] False 2.创建幕布 2.1建立图层幕布 一个图:plt.fig…...

MOS管和三极管有什么区别?
MOS管是基于金属-氧化物-半导体结构的场效应晶体管,它的控制电压作用于氧化物层,通过调节栅极电势来控制源漏电流。MOS管是FET中的一种,现主要用增强型MOS管,分为PMOS和NMOS。 MOS管的三个极分别是G(栅极),D(漏极)&…...

医院多参数空气质量监控和压差监测系统简介@卓振思众
在现代医院管理中,确保患者和医疗人员的健康与安全是首要任务。为实现这一目标,医院需要依赖高科技设施来维持最佳的环境条件。特别是,多参数空气质量监测系统和压差监测系统在这一方面发挥了不可替代的作用。【卓振思众】多参数空气质量监测…...

[项目实战]EOS多节点部署
文章总览:YuanDaiMa2048博客文章总览 EOS多节点部署 (一)环境设计(二)节点配置(三)区块信息同步(四)启动节点并验证同步EOS单节点的环境如何配置 (一…...

setImmediate() vs setTimeout() 在 JavaScript 中的区别
setImmediate() vs setTimeout() 在 JavaScript 中的区别 在 JavaScript 中,setImmediate() 和 setTimeout() 都用于调度任务,但它们的工作方式不同。 JavaScript 的异步特性 JavaScript 以其非阻塞、异步行为而闻名,尤其是在 Node.js 环境…...

【Java文件操作】文件系统操作文件内容操作
文件系统操作 常见API 在Java中,File类是用于文件和目录路径名的抽象表示。以下是一些常见的方法: 构造方法: File(String pathname):根据给定的路径创建一个File对象。File(String parent, String child):根据父路径…...

关于若依flowable的安装
有个项目要使用工作流功能,在网上看了flowable的各种资料,最后选择用若依RuoYi-Vue-Flowable这个项目来迁移整合。 一、下载项目代码: 官方项目地址:https://gitee.com/shenzhanwang/Ruoyi-flowable/ 二、新建数据库ÿ…...

猜数字困难版(1-10000)
小游戏,通过提示每次猜高或猜低以及每次猜中的位数,10次内猜中1-10000的一个数。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthde…...

ASPICE术语表
术语来源描述活动Automotive SPICE V4.0由利益相关方或参与方执行的任务用参数Automotive SPICE V4.0应用参数是包含了在系统或软件层级可被更改的数据的软件变量,他们影响系统或软件的行为和属性。应用参数的概念有两种表达方式:规范(分别包括变量名称、值域范围、…...