转生C++世界:从C开始的C++生活---第一卷 C++入门基础(上)

目录

文章目录

前言

一、C++的第一个程序

二、命名空间

1.namespace的价值

2.namespace该如何定义

注意:

3.命名空间的使用

三、C++输入&输出

四、缺省参数

五、函数重载

总结

 


前言

 

C++兼容C语言绝大多数的语法,C++中需要把定义文件代码后缀改为.cpp,vs编译器看到是。cpp就会调用C++编译器,linux下要用g++编译,不再是gcc。


 

一、C++的第一个程序

#include <stdio.h>
int main(){
    printf("Hello World\n");
    return 0;
}

看到这一串C语言代码是不是相当怀念。该代码在C++中也能运行,但是C++还有自己的输入输出方式。

#include <iostream>
using namespace std;

int main(){
    cout << "Hello World" << endl;
    return 0;
}

看到这里想必你会有点懵逼的,namespace是啥,cout是啥,endl又是啥,<<又是什么鬼。不要着急,我们的C++之旅才刚刚开始。

二、命名空间

1.namespace的价值

使用namespace(命名空间):对标识符的名称进行本地化,以避免命名冲突或者是名字污染。

说人话!!!!!

好的,我们来看下面的例子:

421b495b9c1f4a0f824a8eb095387020.png

 

欸,你猜怎么着。2f53a49c56864737a261e1c1ce80287c.png

因为在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。意思就是非常危险!!!!!!!

在C语言中一不小心我们就会出现上述代码中的问题,于是C++中就加入了namespace来解决这个问题。。。。。你说这C++人还怪好的嘞。

2.namespace该如何定义

C++中域有函数局部域,全局域,命名空间域;域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。说中文就是---------命名空间给了个保护罩,让里面的变量命名变得不危险了。此外,局部域和全局域除了会影响 编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。

6224872b012141a49336ebe6ea47c173.png

注意:

命名空间还可以嵌套。(这里就不多展示了,写两次::的事)

多文件可以定义同名namespace,他们会默认合并到一起,就像同一个namespace一样

看到这里应该有所顿悟,但还差点,别急。

3.命名空间的使用

  • 指定命名空间访问,项目中推荐这种方式。
  • using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。
  • 展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐。
// 指定命名空间访问

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



// using将命名空间中某个成员展开

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


// 展开命名空间中全部成员

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

看到这你已经对命名空间的使用了解的差不多了。想必你会对 “<<” ,">>","::"之流感到困惑,马上为你解答。

三、C++输入&输出

46ce9f9f9aba42a4b92af14c4dcb14a0.png

  • <iostream>是Input Output Stream的缩写,是标准的输入、输出流库,定义了标准的上输入、输出对象。

 

  • <<是流插⼊运算符,>>是流提取运算符。在C语言中这俩哥们还是左移/右移操作符。
 

a628428b157e470b919a9a63cf5a6b50.png

  • std::cin是istream类的对象,它主要面向窄字符的标准输入流。

a3ac3f40410f4d2494a95cc19606a676.png

  • std::cout是ostream类的对象,它主要面向窄字符的标准输出流。

3ec4edc4eaf6442d92321fcfe3d6b4e2.png

  • std::endl是一个函数,流插入输出时,相当于插入一个换行字符加刷新缓冲区。也就是说,除了C语言中的 \n 以外,我们还可以 std::cout << std::endl 来代替换行的效果。这边再插入一些打印换行的方法:

//使用std::endl:    
int number = 42;
std::cout << "The value of number is: " << number << std::endl;
//使用\n进行换行
std::cout << "Hello, World!\n";

std::cout << "The value of number is: " << number << "\n";
//使用<<运算符分开两个输出操作
std::cout << "Hello, World!";
std::cout << std::endl;

那么,C++特有的输入输出方式有什么优势呢???

C语言中的 printf/scanf 需要手动指定格式,C++则可以自动识别变量类型(本质通过函数重载实现,欲知后事如何且听下面讲解),此外,C++还能更好的啊支持自定义类型对象(结构体,联合体,枚举。。。。)的输入输出。

 

cin/cout/endl等都属于C++标准库,C++标准库都放在一个叫std的命名空间中,所以要通过命名空间的使用方式去用他们。这就需要用到b93b442fdbce4db5845569df682facfc.png比较方便。

注意:在包含<iostream>的时候会间接包含了<stdio.h>,所以我们同样可以使用 printf/scanf 。

四、缺省参数

void Func(int a = 0)
{
cout << a << endl;
}
int main()
{
Func(); // 没有传参时,使⽤参数的默认值
Func(10); // 传参时,使⽤指定的实参
return 0;
}

没错,Func函数里的参数就是所谓的缺省参数。

注意: 

  • 缺省参数有全缺省和半缺省。全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。
    C++规定半缺省参数必须 从右往左依次连续缺省,不能间隔跳跃给缺省值。
  •  
    带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。
  •  
    函数声明和定义分离时,缺省参数 不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。
这缺省值这么设计自然有它的道理,还是欲知后事如何,且听下回讲解。

五、函数重载

C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是 参数个数不同或者 类型不同或者 参数顺序不同
// 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;
}
返回值不同不能作为重载条件,因为调用也无法区分!!
 
来点实例吧。
void f1()
{
    cout << "f()" << endl;
}
void f1(int a = 10)
{
    cout << "f(int a)" << endl;
}

上面两个函数构成重载,但是调用时,会报错,存在歧义,编译器不知道调用谁。也很好理解,当你调用f1()时,到底是调用有缺省值的f1还是没有参数的f1呢,编译器就迷糊了。

 


 

总结

本章我们对C++独有的命名空间形式和使用,相较于C语言更方便的输入/输出,神奇的缺省参数,迷人的函数重载做了认识,下一回将对大头---引用,内联做详解。

码字不易,麻烦给个三连给在下做酒钱,咱们江湖相见!

e67486b7407e497ca0254a5e9f8bedb3.png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值