快速从C过度C++(一):namespace,C++的输入和输出,缺省参数,函数重载

📝前言:
本文章适合有一定C语言编程基础的读者浏览,主要介绍从C语言到C++过度,我们首先要掌握的一些基础知识,以便于我们快速进入C++的学习,为后面的学习打下基础。
这篇文章的主要内容有:
1,命名空间namespace
2,C++的输入和输出
3,缺省参数
4,函数重载

🎬个人简介:努力学习ing
📋个人专栏:C++学习笔记
🎀CSDN主页 愚润求学
🌄其他专栏:C语言入门基础,python入门基础,python刷题专栏


快速从C过度C++(一)

  • 一,namespace
    • 1. namespace的定义
      • 1.1. 作用域
      • 1.2. namespace定义
    • 2. namespace的使用
      • 2.1. 指定namespace
      • 2.2. 展开namespace
        • 2.2.1. 展开整个namespace
        • 2.2.2. 展开单个变量
      • 2.3. 使用注意事项
  • 二,C++的输入和输出
    • 1. 核心概念
      • 1.1. 流(Stream)
      • 1.2. 标准流对象
    • 2. 基本输入和输出操作
      • 2.1. 输出
      • 2.2. 输入
    • 3. 格式化输出
      • 3.1. 使用流操纵符
      • 3.2. 控制进制
    • 4. 文件输入和输出
      • 4.1. 文件输出
      • 4.2. 文件输入
    • 5 提升IO效率
  • 三,缺省参数
    • 1. 缺省参数的基本用法
      • 1.1. 语法
      • 2.2. 示例
    • 2. 缺省参数的规则
      • 2.1. 从右向左设置缺省参数
      • 2.2. 函数声明和定义
      • 2.3. 调用时的参数匹配
      • 2.4. 默认值必须是常量或全局变量
  • 四,函数重载
    • 1. 函数重载的基本规则
      • 1.1. 参数列表必须不同
      • 1.2. 示例
      • 1.3. 避免歧义调用


一,namespace

1. namespace的定义

1.1. 作用域

在学习namespace前,我们先了解域的概念。
在C语言中,我们学习过全局变量和局部变量,看下面这段代码:

#include<stdio.h>
int a = 10;
int b = 30;
int main() {int a = 20;printf("%d\n", a); //输出 20printf("%d", b); //输出 30return 0;
}

全局变量的作用域是全局,局部变量的作用域是函数内,且局部变量的优先级高于全局变量。除了这两个域,C++中还有命名空间域,类域。域影响的是编译时语法查找一个变量/函数/类型的出处的逻辑,在同一个域中出现同名,就会冲突,如:

int a = 10;
int a = 30;

在这里插入图片描述
为了解决这个问题,C++引入了namespace,目的是对标识符的名称进行本地化,以避免冲突。
全局域和局部域还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。

1.2. namespace定义

基本语法:
namespace关键字 + 空间名称 + {} (注意{}后不需要跟;),如:

namespace tr
{// 命名课件内可定义 变量/函数/类int a = 10;int sub(int a, int b) {return a - b;}struct Node {struct Node* next;int val;};
}

2. namespace的使用

2.1. 指定namespace

语法:名称::变量名
::是作用域解析符,用来指定要使用的明明空间中的成员

int a = 10;
namespace tr {int a = 20;
}
int main() {printf("%d", tr::a); //输出20return 0;
}

2.2. 展开namespace

2.2.1. 展开整个namespace

语法:using namespace 命名空间名称
using指令会将命名空间中的所有名称引入到当前作用域(注意若有与当前作用域同名的变量,就会冲突),如:

int a = 10;
namespace tr {int a = 20;
}
using namespace tr; //因为全局已经有一个a,会冲突,正确可以使用tr::a来访问a

因此,展开全部成员的这种方法并不推荐,冲突风险很大
正确用法:

int a = 10;
namespace tr {int b = 20;int c = 30;
}
using namespace tr;
int main() {printf("%d", c); // 输出30return 0;
}
2.2.2. 展开单个变量

语法:using 命名空间名称::变量名称

int a = 10;
namespace tr {int b = 20;int c = 30;
}
using tr::b;
int main() {printf("%d", b); // 输出20return 0;
}

2.3. 使用注意事项

  • namespace的本质是一个域,与全局域和局部域各自独立,不同的域可以定义同名变量
  • namespace只能定义在全局,可以嵌套定义。
  • 一个文件中通常不可以有同名的namespace,如果有,编译器会合并,视作一个
  • 不同文件可以有同名的namespace,链接时,编译器会合并同名的
  • namespace未被展开或者指定时,默认在局部和全局里面找变量
  • namespaceusing展开后,查找顺序为:局部域→命名空间域→全局域

二,C++的输入和输出

在C++中,输入和输出(I/O)主要通过标准库中的<iostream>头文件提供的流(stream)机制来实现。C++的I/O流库提供了灵活且类型安全的方式来处理输入和输出操作。

1. 核心概念

1.1. 流(Stream)

  • 流是数据在源和目标之间流动的抽象。
  • 输入流(Input Stream):从外部设备(如键盘、文件)读取数据。
  • 输出流(Output Stream):向外部设备(如屏幕、文件)写入数据。

1.2. 标准流对象

C++预定义了以下标准流对象:

  • std::cin:标准输入流,通常与键盘输入关联。
  • std::cout:标准输出流,通常与屏幕输出关联。
  • std::cerr:标准错误流,用于输出错误信息(无缓冲)。
  • std::clog:标准日志流,用于输出日志信息(有缓冲)。

主要了解前两个

2. 基本输入和输出操作

2.1. 输出

  • 使用std::cout和插入运算符<<将数据输出到屏幕。

  • 示例:

    #include <iostream>int main() {int num = 42;std::cout << "Hello, World!" << std::endl;  // 输出字符串并换行std::cout << "The number is: " << num << std::endl;  // 输出变量// 都是以字符串的形式输出,相当于把 << 中间的字符串合并后输出,一个<<   <<之间只能放一个变量return 0;
    }
    
  • std::endl:插入一个换行符并刷新输出缓冲区

2.2. 输入

  • 使用std::cin和提取运算符>>从键盘读取数据。
  • 示例:
    #include <iostream>int main() {int age;std::cout << "Enter your age: ";std::cin >> age;  // 从键盘读取输入并存储到变量 age,多个变量输入时,可用空格,换行符等符号间隔std::cout << "You are " << age << " years old." << std::endl;return 0;
    }
    
  • 注意std::cin会跳过空白字符(如空格、制表符、换行符)。

cincout自动判断类型

3. 格式化输出

虽然C++提供了多种方式格式化输出,但是我们任然可以继续使用C语言的格式化输出方式,因为C++兼容C语言
下面介绍C++的格式化输出:

3.1. 使用流操纵符

  • std::setw(n):设置输出宽度为n
  • std::setprecision(n):设置浮点数精度为n
  • std::fixed:以固定小数格式输出浮点数。
  • std::scientific:以科学计数法输出浮点数。
  • 示例:
    #include <iostream>
    #include <iomanip>  // 包含流操纵符int main() {double pi = 3.141592653589793;std::cout << std::fixed << std::setprecision(2) << "Pi: " << pi << std::endl;return 0;
    }
    

3.2. 控制进制

  • std::dec:十进制(默认)。
  • std::hex:十六进制。
  • std::oct:八进制。
  • 示例:
    int num = 255;
    std::cout << std::hex << "Hex: " << num << std::endl;  // 输出 ff
    

4. 文件输入和输出

C++通过<fstream>头文件支持文件操作:

4.1. 文件输出

  • 使用std::ofstream将数据写入文件。
  • 示例:
    #include <iostream>
    #include <fstream>int main() {std::ofstream outFile("output.txt");if (outFile.is_open()) {outFile << "Hello, File!" << std::endl;outFile.close();} else {std::cerr << "Failed to open file!" << std::endl;}return 0;
    }
    

4.2. 文件输入

  • 使用std::ifstream从文件读取数据。
  • 示例:
    #include <iostream>
    #include <fstream>
    #include <string>int main() {std::ifstream inFile("input.txt");std::string line;if (inFile.is_open()) {while (std::getline(inFile, line)) {std::cout << line << std::endl;}inFile.close();} else {std::cerr << "Failed to open file!" << std::endl; // 若文件未打开使用 std::cerr 输出错误信息。}return 0;
    }
    

5 提升IO效率

ios_base::sync_with_stdio(false);
cin.tie(nullptr); 
cout.tie(nullptr);

第一句:解除 iostream 与 C 标准库的同步。但要注意,一旦解除同步,就不能再混合使用 C++ 的流操作和 C 的函数操作,否则会导致输入输出顺序混乱
第二,三句:解除cincout的绑定。在默认情况下,cin 是和 cout 绑定在一起的,即:在执行 cin 操作之前,会先刷新 cout 的缓冲区,以确保输出的内容都被显示出来。


三,缺省参数

缺省参数(Default Arguments)允许函数在定义时为某些参数指定默认值。如果调用函数时没有为这些参数提供实参,则使用默认值。

1. 缺省参数的基本用法

1.1. 语法

返回值类型 函数名(参数类型 参数名 = 默认值);

2.2. 示例

#include <iostream>// 函数声明,带有缺省参数
void printMessage(std::string message = "Hello, World!");int main() {printMessage();          // 使用默认参数,输出: Hello, World!printMessage("Hi!");     // 提供自定义参数,输出:Hi!return 0;
}// 函数定义
void printMessage(std::string message) {std::cout << message << std::endl;
}

2. 缺省参数的规则

2.1. 从右向左设置缺省参数

  • 缺省参数必须从右向左依次设置,不能跳过中间的参数
  • 示例:
    void func(int a, int b = 10, int c = 20);  // 正确
    void func(int a = 5, int b, int c = 20);   // 错误:b 没有默认值
    

2.2. 函数声明和定义

  • 如果函数在声明时指定了缺省参数,定义时不能再重复指定。
  • 示例:
    // 声明时指定缺省参数
    void printNumber(int num = 42);// 定义时不能重复指定,即: 这里不能再写int num = 30
    void printNumber(int num) {std::cout << num << std::endl;
    }
    

2.3. 调用时的参数匹配

  • 如果提供了实参,则使用实参;否则使用默认值。
  • 必须从左到右依次给实参,不能跳跃给实参
  • 示例:
    void printSum(int a, int b = 10, int c = 20) {std::cout << "Sum: " << a + b + c << std::endl;
    }int main() {printSum(1);        // 输出:Sum: 31 (1 + 10 + 20)printSum(1, 2);     // 输出:Sum: 23 (1 + 2 + 20)printSum(1, 2, 3);  // 输出:Sum: 6 (1 + 2 + 3)return 0;
    }
    

2.4. 默认值必须是常量或全局变量

  • 默认值不能是局部变量或动态计算的值。
  • 示例:
    int defaultValue = 10;
    void func(int a = defaultValue);  // 正确
    void func(int a = rand());       // 错误:默认值不能是动态计算的值
    

四,函数重载

函数重载(Function Overloading) 是C++中的一种特性,允许在同一个作用域内定义多个同名函数,但这些函数的参数列表必须不同(参数的类型、数量或顺序不同)。

1. 函数重载的基本规则

1.1. 参数列表必须不同

  • 函数重载的核心是参数列表的不同。参数列表的不同可以体现在:
    • 参数的类型不同
    • 参数的数量不同
    • 参数的顺序不同(如果类型不同)。
  • 注意:返回值类型不同不能作为函数重载的依据。

1.2. 示例

下面共五个重载

#include <iostream>void print(int a) {std::cout << "Printing int: " << a << std::endl;
}void print(double a) { // 类型不同std::cout << "Printing double: " << a << std::endl;
}void print(int a, int b) { // 数量不同std::cout << "Printing two ints: " << a << ", " << b << std::endl;
}// 下面两者为顺序不同
void print(int a, char c) { std::cout << "Printing int: " << a << ' ' << "Printing char: " << c << std::endl;
}void print(char c, int a) { std::cout << "Printing int: " << a << ' '<< "Printing char: " << c << std::endl;
}int main() {print(10);          // 调用 void print(int a)print(3.14);        // 调用 void print(double a)print(10, 20);      // 调用 void print(int a, int b)print(10, 'c');     // 调用 void print(int a, char c)print('d', 10);     // 调用 void print(char c, int a)return 0;
}

输出:

Printing int: 10
Printing double: 3.14
Printing two ints: 10, 20
Printing int: 10 Printing char: c
Printing int: 10 Printing char: d

1.3. 避免歧义调用

  • 示例一:

    void func(int a, double b = 3.14);
    void func(int a);func(10);  // 错误:调用歧义,无法确定调用哪个函数
    
  • 示例二:

void func(int a = 3, double b = 3.14);
void func(int a, double b, int c);func(10); // 歧义:因为第一个func可接受参数数量:[0,2],第二个func可接受参数数量 3 编译器无法判断是错误的调用了第二个还是正确的调用了第一个
func(); // 会调用第一个,因为没参数,编译器可判断
func(10, 2.1, 5); // 会调用第二个,因为传入了三个参数

尽量避免写容易歧义的函数重载,在调用时也要判断重载的函数是否有歧义。

最后推荐几个个C++参考文档
1,非官方,按头文件分类:https://legacy.cplusplus.com/reference/
2,官方中文:https://zh.cppreference.com/w/cpp
3,官方英文:https://en.cppreference.com/w/


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

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

相关文章

C语言 进阶指针学习笔记

文章目录 字符指针指针数组数组指针数组名数组传参 函数指针函数指针数组指向函数指针数组的指针 回调函数Qsort 的使用通过冒泡排序模拟实现 qsort 大部分的内容都写在代码注释中 指针有类型&#xff0c;指针的类型决定了指针的整数的步长&#xff0c;指针解引用操作的时候的权…

李沐《动手学深度学习》——14.9. 用于预训练BERT的数据集——wiki数据集问题以及存在的其他问题

问题1&#xff1a;出现"file is not a zip file" 原因是链接已经失效。 解决方法&#xff1a;打开下面链接自行下载&#xff0c;需要魔法。下载完解压到特定位置。 下载链接&#xff1a;项目首页 - Wikitext-2-v1数据包下载:Wikitext-2-v1 数据包下载本仓库提供了一…

【芯片验证】verificationguide上的36道UVM面试题

跟上一篇一样,verificationguide上的36到UVM面试题,通义回答ds判卷。 1. What is uvm_transaction, uvm_seq_item, uvm_object, uvm_component? uvm_transaction、uvm_seq_item、uvm_object、uvm_component是什么? uvm_transaction是UVM中所有事务的基础类,用于表示仿真…

Python 动态规划(DP)套路总结

Python 动态规划&#xff08;DP&#xff09;套路总结 在解决算法问题时&#xff0c;动态规划&#xff08;DP&#xff09; 是一种非常常见的优化技巧&#xff0c;它可以通过保存子问题的结果来避免重复计算&#xff0c;从而减少时间复杂度。Python 提供了非常方便的语法特性&am…

ESP32驱动OV3660摄像头实现yoloV5物体分类(摄像头支持红外夜视、边缘AI计算)

目录 1、传感器特性 2、硬件原理图 3、驱动程序 ESP32-S3 AI智能摄像头模块是一款专为智能家居和物联网应用打造的高性能边缘AI开发模组。它集成了摄像头、麦克风、音频功放、环境光传感器和夜视补光灯,无需依赖云端即可实现本地化AI推理。 凭借TensorFlow Lite、YOLO和O…

RReadWriteLock读写锁应用场景

背景 操作涉及一批数据&#xff0c;如订单&#xff0c;可能存在多个场景下操作&#xff0c;先使用读锁&#xff0c;从redis缓存中获取操作中数据 比如 关闭账单&#xff0c; 发起调账&#xff0c; 线下结算&#xff0c; 合并支付 先判断当前操作的数据&#xff0c;是否在…

网络安全高级软件编程技术 网络安全 软件开发

安全软件开发入门 软件安全问题 有趣的《黑客帝国》终极解释&#xff1a; 《黑客帝国》故事里面的人物关系&#xff0c;就像电脑里面的各种程序的关系一样&#xff1a; 电脑里面的系统程序&#xff1a;Matrix&#xff1b; 病毒程序&#xff1a;以Neo为首的人类&#xff1b; 防病…

苹果商店上架流程,app上架发布流程

苹果商店地址 https://appstoreconnect.apple.com/login 其他地址:开发 - Apple Developer 1.更新代码 将项目的代码更新到最新,更新成功后右下角会给出提示 2.打开模拟器 鼠标右键可以选择设备(Device) 3.测试运行 如下图可以看到已经识别到设备了,点击运行即可,运行到模…

正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-2.1 uboot简介

前言&#xff1a; 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用&#xff1a; …

Better-SQLite3 参数绑定详解

Better-SQLite3 参数绑定详解 在使用 better-sqlite3 进行数据库操作时&#xff0c;参数绑定是一个非常重要的概念。它不仅提高了代码的可读性和安全性&#xff0c;还能有效防止 SQL 注入攻击。本文将详细介绍如何在 better-sqlite3 中使用匿名参数和命名参数&#xff0c;并展…

C++编程:进阶阶段—4.1封装

C面向对象的三大特性&#xff1a;封装、继承、多态 具有相同性质的对象&#xff0c;抽象为类 4.1 封装 封装的意义&#xff1a;将属性和行为作为一个整体&#xff0c;表现生活中的事物&#xff0c;并将属性和行为加以权限控制。 4.1.1 类的定义及实例化对象 语法&#xff…

运行OpenManus项目(使用Conda)

部署本项目需要具备一定的基础&#xff1a;Linux基础、需要安装好Anaconda/Miniforge&#xff08;Python可以不装好&#xff0c;直接新建虚拟环境的时候装好即可&#xff09;&#xff0c;如果不装Anaconda或者Miniforge&#xff0c;只装过Python&#xff0c;需要确保Python是3.…

spring boot + vue 搭建环境

参考文档&#xff1a;https://blog.csdn.net/weixin_44215249/article/details/117376417?fromshareblogdetail&sharetypeblogdetail&sharerId117376417&sharereferPC&sharesourceqxpapt&sharefromfrom_link. spring boot vue 搭建环境 一、浏览器二、jd…

MPPT与PWM充电原理及区别详解

MPPT&#xff08;最大功率点跟踪&#xff09;和PWM&#xff08;脉宽调制&#xff09;是太阳能充电控制器中常用的两种技术&#xff0c;它们在原理、效率和适用场景上有显著区别。以下是两者的详细对比&#xff1a; 1. 工作原理 PWM&#xff08;脉宽调制&#xff09; 核心机制…

slam学习笔记9---ubuntu2004部署interactive_slam踩坑记录

背景&#xff1a;interactive_slam是一款可用于离线优化点云地图算法。部署安装容易出问题&#xff0c;这里记录一下。 一、安装基本流程 绝大部分跟着readme走&#xff0c;g2o安装使用apt安装 interactive_slam depends on the following libraries:GL3W GLFW Dear ImGui p…

视觉图像处理

在MATLAB中进行视觉图像处理仿真通常涉及图像增强、滤波、分割、特征提取等操作。以下是一个分步指南和示例代码,帮助您快速入门: 1. MATLAB图像处理基础步骤 1.1 读取和显示图像 % 读取图像(替换为实际文件路径) img = imread(lena.jpg); % 显示原图 figure; subplot(2…

用java如何利用jieba进行分词

在Java中使用jieba进行分词&#xff0c;可以借助jieba的Java版本——jieba-analysis。jieba-analysis是一个基于jieba分词算法的Java实现&#xff0c;支持精确模式、全模式和搜索引擎模式等多种分词方式。 以下是使用jieba-analysis进行分词的详细步骤和示例代码&#xff1a; …

【含文档+PPT+源码】Python爬虫人口老龄化大数据分析平台的设计与实现

项目介绍 本课程演示的是一款Python爬虫人口老龄化大数据分析平台的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…

【A2DP】SBC 编解码器互操作性要求详解

目录 一、SBC编解码器互操作性概述 二、编解码器特定信息元素(Codec Specific Information Elements) 2.1 采样频率(Sampling Frequency) 2.2 声道模式(Channel Mode) 2.3 块长度(Block Length) 2.4 子带数量(Subbands) 2.5 分配方法(Allocation Method) 2…