当前位置: 首页 > news >正文

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;
}

9657b2921ed74033a3facb4309b4d3ea.png

在使用命名空间域内定义的变量的时候有以下几种方法:

(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文件依然给缺省值8f8a9847e9b44ce5b500273610911e81.png

c9e273398e5a42238c16faf218486518.png

编译器报错:

7ae3d12f5ce34d989c529e305d8102ba.png

所以应该将.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;
}

b14bec1fb64c401b9589f9c4333c295d.png

但是返回值不同不可以

c50de625aa3b434f8a3a763d719865fa.png

六:引用

(一)引用的定义和特性

(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;
}

146e630148c84f279d9fc2f7be1276ff.png

(2)引用定义的时候必须要初始化:看吧。

86ada2d0b9424c2dbe4b86a709d61100.png

(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)指针需要开辟空间,指针变量存储的是空间的地址。引用不需要开空间,他是所引用对象的另一个别名。

dc2f10bc354e417faf31eeed4c043eb5.png

(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;
}

5e923efd384345de9d2b8b66b171c14b.png

(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;
}

48b55ddc46494f01964169fa51ad5642.png

 

 

相关文章:

C到C++入门基础知识

一&#xff1a;命名空间&#xff1a;namespace &#xff08;一&#xff09;&#xff1a;命名空间的定义 注&#xff1a;命名空间只能定义在全局&#xff0c;不能定义在函数内部。 &#xff08;1&#xff09;类似于C语言的结构体&#xff0c;C语言的命名空间定义为&#xff1…...

Aigtek功率放大器的主要参数有什么

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

运维工程师概述及职责

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

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插件实现绑定玩家输入以及制作小骑士移动空闲动画

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、通过InControl插件实现绑定玩家输入二、制作小骑士移动和空闲动画 1.制作动画2.玩家移动和翻转图像3.状态机思想实现动画切换总结 前言 好久没来CSDN看看&…...

基于鸿蒙API10的RTSP播放器(七:亮度调节功能测试)

目标&#xff1a; 当我的手指在设备左方进行上下移动的时候&#xff0c;可以进行屏幕亮度的调节&#xff0c;在调节的同时&#xff0c;有实时的调节进度条显示 步骤&#xff1a; 界面逻辑&#xff1a;使用Stack() 组件&#xff0c;完成音量图标和进度条的组合显示&#xff0c…...

基于SpringBoot+Vue的校内跑腿业务管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、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&#xff08;COD&#xff09;任务中&#xff0c;decoder 的确有一个核心作用是进行 上采样 以恢复图像的分辨率&#xff0c;但这并不是它唯一或最核心的作用。我们可以从更广泛的视角来看 decoder 的作用。 1. 上采样&#xff08;Upsampling&a…...

Java volatile

Volatile 作用&#xff1a;保证变量的可见性&#xff0c;有序性&#xff08;禁止指令重排序&#xff09;。不保证原子性。 如何保证可见性的&#xff1f; 场景&#xff1a;每个 线程 下都有一块 工作内存。要使用变量需要从 主内存 中把 变量 读取出来&#xff0c;使用完成后写…...

一条sql是如何执行的详解

一条sql是如何执行的详解 1. SQL 解析&#xff08;Parsing&#xff09; 2. 查询重写&#xff08;Query Rewrite&#xff09; 3. 查询规划&#xff08;Query Planning&#xff09; 4. 查询执行&#xff08;Query Execution&#xff09; 5. 结果返回 示例&#xff1a;查询执…...

“先天项目经理圣体”丨超适合做项目经理的4种人

总有人在问&#xff0c;什么样的人适合做项目经理&#xff0c;当项目经理需要什么样的特质&#xff1f; 你别说&#xff0c;还真有那么一些人是“先天项目经理圣体”&#xff0c;天生就是吃项目经理这碗饭的。 沟通达人丨靠“嘴”走天下 我们知道项目经理大部分的时间都在进行…...

如何从object中抽取某几个值,然后转换成数组

可以使用Object.entries(), Array.prototype.filter()和Array.prototype.map()或者解构赋值的方式从对象中抽取某些值并转换为数组 示例 1&#xff1a;使用 Object.entries(), filter() 和 map() const obj {a: 1,b: 2,c: 3,d: 4 };const keysToExtract [a, c];const extr…...

数据结构(14)——哈希表(1)

欢迎来到博主的专栏&#xff1a;数据结构 博主ID&#xff1a;代码小豪 文章目录 哈希表的思想映射方法&#xff08;哈希函数&#xff09;除留余数法 哈希表insert闭散列负载因子扩容find和erase 哈希表的思想 在以往的线性表中&#xff0c;查找速度取决于线性表是否有序&#…...

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 都是服务发现和注册中心的解决方案&#xff0c;但它们在功能、设计和使用场景上有所不同。以下是它们的详细区别&#xff1a; 1. 基本概念 Eureka&#xff1a;是由 Netflix 开发的服务发现工具。它主要用于 Java 微服务架构中的服务注册与发现。Eureka 通过 R…...

AI大模型包含哪些些技术?

Prompt Prompt提示是模型接收以生成响应或完成任务的初始文本输入。 我们给AI一组Prompt输入&#xff0c;用于指导模型生成响应以执行任务。这个输入可以是一个问题、一段描述、一组关键词&#xff0c;或任何其他形式的文本&#xff0c;用于引导模型产生特定内容的响应。 Tra…...

分布式技术概览

文章目录 分布式技术1. 分布式数据库&#xff08;Distributed Databases&#xff09;2. 分布式文件系统&#xff08;Distributed File Systems&#xff09;3. 分布式哈希表&#xff08;Distributed Hash Tables, DHTs&#xff09;4. 分布式缓存&#xff08;Distributed Caching…...

动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习

动手学习RAG: 向量模型动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习动手学习RAG&#xff1a;迟交互模型colbert微调实践 bge-m3 1. 环境准备 pip install transformers pip install open-retrievals注意安装时是pip install open-retrievals&#xff0c;但调用时只…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...