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

目录

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.函数重载与缺省函数合并,编译不报错,调用会报错,不知道调用哪个

  • 29
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值