更易理解的C++入门上(命名空间、C++输入输出、缺省参数、函数重载)

news/2024/7/5 2:10:28

目录

1.命名空间

1.命名空间的定义和概念

2.命名空间的使用

命名空间样例:

1.加命名空间名称及作用域限定符

2.使用using将命名空间中某个成员引入

3.使用using namespace 命名空间名称引入

3.命名空间中的结构体当定义结构体时如何使用

​编辑4.头文件与源文件中的命名空间重名会怎样?

2.C++输入&输出

3.缺省参数

1.缺省参数的概念

2.缺省参数的分类

1.全缺省参数

2.半缺省参数

4.函数重载

1.函数重载的概念

2.函数重载的使用:

3.注意:

使用样例:

执行结果:

2.函数重载的分类:

1.参数类型不同

2.参数个数不同

3.参数类型顺序不同

3.函数重载与缺省函数合并,编译不报错,调用会报错,不知道调用哪个


1.命名空间

        C++为了避免变量、函数、类的名称发生冲突或名字污染,命名空间(namespace关键字)腾空而生。

1.命名空间的定义和概念

#include <iostream>
using namespace std;
namespace A{
    int b = 10;
}

namespace B{
    int b = 20;
}

int main()
{
    printf("%d\n",A::b);
    printf("%d\n",B::b);
    //cout << A::b << endl;
    //cout << B::b << endl;
}

A省有名叫b这个人,B省有名叫b这个人,A省的b10岁,B省的b20岁.

cout是console out 控制台输出、cin是控制台输入.

命名空间里的定义是属于全局变量,随程序的结束而销毁,不随函数的结束而销毁.

std是C++标准库的命名空间,C++将标准库的定义实现都放到这个命名空间中,其中有cout,cin等全局的类对象,具体内容期待C++类和对象.

命名空间可以理解为城墙,那么using namespace可以理解为拆掉城墙,如果不拆掉std的城墙,cout需要写成std::cout和std::endl,麻烦!

当然平常练习时可以拆掉整个std城墙,对于写大项目时拆掉城墙意味着可能会出现命名冲突,这时就需要using std::cout 和 using std::cin 这样单独拆小城墙不影响命名发生冲突.

所以拆城墙,用着方便,但特殊情况也会发生命名冲突.

一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中.

2.命名空间的使用

命名空间样例:

namespace N{
    int a = 10;
    int b = 20;
}

1.加命名空间名称及作用域限定符

int main()
{
    printf("%d\n", N::a);
    return 0;
}

2.使用using将命名空间中某个成员引入
 

using N::b;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    return 0;
}

3.使用using namespace 命名空间名称引入

using namespce N;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    printf("%d\n", a);
    return 0;
}

3.命名空间中的结构体当定义结构体时如何使用

struct+命名空间名::结构体类型名+结构体变量名 = 初始化的值


4.头文件与源文件中的命名空间重名会怎样?

.h/.c/.cpp重名且同局域的命名空间编译时会合并,如果引用头文件,也不必怀疑预处理头文件会展开,也就应对了在一个文件中,同局域的命名空间如果重名则会合并

2.C++输入&输出

1.使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
以及按命名空间使用方法使用std.

2.cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<
iostream>头文件中.

3.<<是流插入运算符,>>是流提取运算符.

4.C++的输入cin输出cout可以自动识别类型,C需要手动控制格式,当然配合使用最佳,按具体使用场景的来使用,例如:浮点型要求小数点后一位的打印,printf更适合.

5.实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识.

注意:C++区分C,C++头文件不带h,旧编译器(vc6.0)还支持iostream.h,后续编译器不支持.

3.缺省参数

1.缺省参数的概念

缺省参数是声明或定义函数时为函数的参数指定一个缺省值,即在没有传实参时,形参设置缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

#include <iostream>
using namespace std;
int test(int a = 10)
{
   return a; 
}

int main()
{
    cout << test() << endl;
}

缺省参数的值是按实参顺序给,从左到右不可以跳,实参给值则用实参,不给则用缺省值,那么这个缺省参数会用到哪里呐?下面给个例子:顺序表的capacity(容量),StackInit初始化时可以不用传默认容量个数,使用缺省参数可以灵活多变,
//StackInit(struct Node* ptr,int defaultCP = 4);

2.缺省参数的分类

1.全缺省参数

void Func(int a = 10, int b = 20, int c = 30)
{
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    cout<<"c = "<<c<<endl;
}

2.半缺省参数

void Func(int a, int b = 10, int c = 20)
{
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    cout<<"c = "<<c<<endl;
}

注意:

1. 半缺省参数必须从右往左依次来给出,不能间隔着给

2. 缺省参数不能在函数声明和定义中同时出现   

3. 缺省值必须是常量或者全局变量


4. C语言不支持(编译器不支持)

4.函数重载

1.函数重载的概念

函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数
些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同
常用来处理实现功能类似数据类型
不同的问题.

2.函数重载的使用:

当然调用时会自动识别类型来调用因为在编译时会根据函数名长度、函数参数类型、返回值类型的首字母缩写来分明重载函数

下面代码的两个函数修饰名分别为_Z3addii和_Z3adddd,具体名字修饰的格式依据编译器不同而定.

函数重载的底层原理是编译时字符表(包括函数名和地址)内的函数名进行了修饰,编译器不同修饰方式不同,例如linux下的g++编译的函数.
例两个函数void f(int a,int c) 和 void f(int a,char c),修饰名分别为_z1fii和_z1fic,其中数字是函数名长度,f是函数名,f后面的是参数类型缩写,编译器依函数修饰名来调用(call)相关函数,而c语言中的字符表内容是函数名加地址,函数名不做修饰

#include <iostream>
using namespace std;
int add(int a,int b)
{
    return a + b;
}

double add(double a,double b)
{
    return a + b;
}

int main()
{
    int sum1 = add(1,2);
    double sum2 = add(1.1,2.2);
}

3.注意:

C语言不支持函数重载.

如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办
法区分
。int f(int a) void f(int a)  返回类型不同不构成函数重载,就算是函数名修饰多加一个返回类型的缩写编译器也是会报错的,因为调用时存在二义性

2.函数重载的分类:

1.参数类型不同

int Add(int left, int right)
{
    cout << "int Add(int left, int right)" << endl;
    return left + right;
}

double Add(double left, double right)
{
    cout << "double Add(double left, double right)" << endl;
    return left + right;
}

2.参数个数不同

void f()
{
    cout << "f()" << endl;
}
void f(int a)
{
    cout << "f(int a)" << endl;
}

3.参数类型顺序不同

void f(int a, char b)
{
    cout << "f(int a,char b)" << endl;
}

void f(char b, int a)
{
    cout << "f(char b, int a)" << endl;
}

3.函数重载与缺省函数合并,编译不报错,调用会报错,不知道调用哪个


http://lihuaxi.xjx100.cn/news/74314.html

相关文章

PixelRNN--学习笔记

背景&#xff1a; 生成图像建模是无监督学习中的核心问题。生成建模的一大优势是可以从中学习无穷无尽的图像数据。生成模型&#xff1a; 大多数工作关注随机隐变量模型&#xff0c;如VAE旨在提取有意义的表示&#xff0c;但往往会出现一个难以推断的推理步骤&#xff0c;这会阻…

为什么PPO不可以像DQN一样使用Replay Buffer?——强化学习

1 PPO回顾 PPO算法如下&#xff1a; 其中&#xff0c;Pθ′P_{\theta}Pθ′​和Aθ′A^{\theta}Aθ′都是使用由target policyθ′\thetaθ′采集的数据来计算&#xff0c;在更新了behaviour policy多次后&#xff0c;清空前面保存的数据&#xff1b;使用behaviour policy更…

C · 初阶 | 光速初识C语言

啊我摔倒了..有没有人扶我起来学习.... 目录前言零、什么是C语言&#xff1f;一、第一个C语言程序二、数据类型三、变量、常量3.1 定义变量的方法3.2 变量的命名3.3 变量的分类3.4 变量的作用域和生命周期3.5 常量四、字符串转义字符注释4.1 字符串4.2 转义字符五、注释六、选择…

【学习记录】入坑SLAM一年后的理解

一、前言 入坑SLAM也有一年了&#xff0c;也看了不少视觉SLAM的方法&#xff0c;最近也开始涉猎一些激光SLAM的方法&#xff0c;在看的这些方法中&#xff0c;大多数的重点都放在了前端的部分&#xff0c;因为师兄说过大多数的SLAM方法后端都没什么变化&#xff0c;都是画因子…

Mac安装docker(轻松解决安装)

Mac安装docker&#xff08;轻松解决安装&#xff09; 1、docker是什么&#xff1f; Docker的三个基本概念: Image(镜像) Container(容器) Repository(仓库) Docker的思想来自于集装箱&#xff0c;集装箱解决了什么问题&#xff1f; 在一艘大船上&#xff0c;可以把货物规整的…

第06章 所有的晕厥都不可掉以轻心

【晕倒后第一时间要做的快速检查】这是一段真实的故事&#xff0c;大家听完不许笑。 大家都知道我是一名医生&#xff0c;大家都知道在中国看病很困难&#xff0c;所以大家都知道在中国认识一名医生是一件很重要的事&#xff0c;所以我从来没有被小学同学、初中同学、高中同学&…

MySQL数据库_02_数据库基础知识

一. 数据库和文件 数据库和文件一样存储的介质可以是内存也可以是磁盘。为什么有文件了还需要数据库&#xff1f;因为文件的安全性不高&#xff0c;也不利于大量数据的存储&#xff0c;查询和管理&#xff0c;在程序中控制也不怎么方便。 二. 数据库服务器&#xff0c;数据库&a…

Debezium系列之:详细记录数据库迁移debezium保证数据不丢失的方法和步骤流程

Debezium系列之:详细记录数据库迁移debezium保证数据不丢失的方法和步骤流程 一、背景二、方法一:新起debezium connector三、方法二:设置mysql位点步骤1:DBA提供位点步骤2:准备新域名debezium connector的配置步骤3:删除采集旧域名数据库的debezium connector步骤4:写入…