高效学习C++基础部分&话题挑战赛

文章目录

  • 写在前面:话题挑战赛第1期
  • 一、C++关键字
  • 二、命名空间
    • 1.命名空间的定义
    • 2.命名空间的使用
  • 三、C++输入&输出
  • 四、缺省参数/默认参数
    • 1.缺省参数的定义
    • 2.缺省参数分类
      • I.全缺省参数
      • II.半缺省参数
  • 五、函数重载
  • 六、遇见安然遇见你,不负代码不负卿

写在前面:话题挑战赛第1期

开始入坑C++了,嗐,说实话细节有好多,怎么说呢,我相信,今天是灰色的,明天是灰色的,后天一定是美好的,加油吧少年们。
高效学习C++基础部分&话题挑战赛_第1张图片在开始之前嘞,先向大家介绍目前官方大力支持的一项活动:话题挑战赛第一期
高效学习C++基础部分&话题挑战赛_第2张图片一个人走,可能走的很快,但一群人走,将走的更远,以来路作灯,共同成长,展现技术人风采!

我的话题是:大学学习月/季度总结
是呀,大学学习都有哪些收获呢,邀您一同分享,我觉得对于我们学生来说是非常好的,在这里我们可以复盘上个月/季度的学习。模板如下:大学学习月/季度总结
高效学习C++基础部分&话题挑战赛_第3张图片对,其实是非常简单的,如果有兴趣或是有什么问题,欢迎私信我哈。
活动奖品:
话题团队中首次发稿人数达到40人+,团队成员可一起瓜分2500元,活动链接如下:话题挑战赛第1期

高效学习C++基础部分&话题挑战赛_第4张图片

一、C++关键字

C++有63个关键字,而C语言只有32个关键字。

asm do if return try continue
auto double inline short typedef for
bool dynamic_cast int signed typeid public
break else long sizeof typename throw
case enum mutable static union wchar_t
catch explicit namespace static_cast unsigned defualt
char export new struct using friend
class extern operator switch virtual register
const false private template void true
const_cast float protected this volatile while
delete goto reinterpret_cast

这里的话就不详细介绍了,后面会详细讲解。


二、命名空间

在C++中,变量、函数和类型都是大量存在的。如果全部存在于全局作用域中,可能会导致许多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突和名字污染,namespace关键字的出现就是针对这种问题的。

例题:

#include

int rand = 0;

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

上面的代码是没有问题的,但是加上这个头文件之后程序就挂了。

#include
#include

int rand = 0;

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

高效学习C++基础部分&话题挑战赛_第5张图片

rand()是一个库函数存在于stdlib.h头文件中,而在编译的时候头文件会展开,这时候变量rand和库函数rand都存在与同一个作用域中(全局作用域)

从上面的错误示范中可以得到,同一个作用域里面不可以出现同名变量,因为会导致命名冲突,在C语言中没有很好地解决这个问题,但在C++中引入namespace来解决它,在命名空间中定义变量,函数,类型均可。

那怎么改才是对的呢?

#include
#include

namespace SL//命名空间域
{
    int rand = 0;
}

int main()
{
    printf("%d\n", SL::rand);//::域作用域限定符,如果左边是空白,则默认是全局作用域中的rand
    return 0;
}

1.命名空间的定义

定义命名空间,需要使用namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

普通命名空间的定义

 namespace SL//SL为命名空间的名称
 {
     //命名空间中的内容,即可以定义变量、函数、还可以定义类型
     int a = 0;
     int Add(int x, int y)
     {
         return x + y;
     }
     struct Node
     {
     	int val;
         struct Node* next;
     };
 }
 

命名空间支持嵌套和重名

   namespace byte
   {
       int a = 0;
       namespace data//命名空间可以嵌套,一般多是2~3层
       {
           struct Node
           {
             	int val;
               struct Node* next;
           };
       }
   }

   //在同一工程中允许存在多个相同名称的命名空间,编译器最后会合并在同一个命名空间中
   namespace byte
   {
       int b = 0;
       namespace cache
       {
           struct Node
           {
               int val;
               struct Node* next;
           }
       }
   }

注意:

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

命名空间不会影响变量的生命周期,而且命名空间的定义只能是全局的,不能在局部中定义,比如在main函数中定义就是错误的,而且一般命名空间是定义在头文件下的。

总结:

  • 命名空间中的内容:可以定义变量、函数,还可以定义类型;
  • 命名空间支持嵌套(防止工程太大导致命名冲突);
  • 同名的命名空间是允许同时存在的,编译器编译时会自动合并。

2.命名空间的使用

//意思是把byte这个命名空间中的内容放出来
using namespace byte;

//这两行代码的意思是先展开byte,再展开data,如果颠倒顺序是错误的,而且意义不等同于using namespace byte::data;
using namespace data;

//注意哦,这里展开的是byte中的cache,并没有将byte展开
using namespace byte::cache;

using的意义:将命名空间中的内容全部或部分放出来。

using namespace byte;//全部放出来

using namespace byte::a;//部分放出来

命名空间的三种使用方式:

  • 加命名空间名称及作用域限定符
std::cout << byte::a << std::endl;
  • 使用using将命名空间中成员引入(通常用来放部分常用的)
using std::cout;
using std::endl;
using byte::a;
	cout << a << endl;
	cout << byte::b << endl;
  • 使用using namespace命名空间引入(放了全部)
using namespace byte;
using namespace std;
//std是C++标准库的命名空间,全部放出来虽然方便使用了,但是存在冲突风险,所以我们平时在写一些练习不在乎冲突的时候,可以将它全部放出来,正常情况下没必要全部放出来

三、C++输入&输出

下面看看C++是如何向世界打招呼的:

#include
using std::cout;
using std::endl;

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

说明:

  • 使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含头文件以及std标准命名空间;注意:早期的标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,后来将其实现在std命名空间下,为了和c头文件区分也为了正确使用命名空间,规定C++头文件不带.h
  • 使用C++输入输出更方便,不需要增加数据格式控制,如%d, %c等

四、缺省参数/默认参数

缺省参数可以形象的比作我们生活中的备胎,嗯呢,C++中函数的参数是可以配备胎的,但是注意哦,C语言不支持缺省参数。

1.缺省参数的定义

缺省参数是声明或定义函数时为函数的参数指定一个默认值。

在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。

void TestFunc(int a = 0)
{
    cout << a << endl;
}

int main()
{
    TestFunc();//没有传参时,使用参数的默认值
    TestFunc(10);//传参时,使用指定的实参
    return 0;
}

2.缺省参数分类

I.全缺省参数

全缺省参数指的是全部给了缺省参数/默认参数

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

II.半缺省参数

半缺省参数指的是部分缺省,注意:半缺省必须是从右往左依次来给出,不能隔着给

比如下面的代码是正确的:

void TestFunc(int a, int b = 10, int c = 20)
{
    ...
}

如果是这样给出,是错误的

void TestFunc(int a = 10, int b, int c = 20)
{
    ...
}

注意:

  • 缺省参数不能在声明和定义中同时给出,因为如果声明和定义同时给,恰好提供的值又不同,那么编译器就无法确定该用哪个缺省值;
  • 声明给,定义不给 —— 可以;
  • 声明不给,定义给 —— 不可以(编译器编译的时候看函数声明,链接的时候才看函数定义。

综上,缺省参数是在函数声明的时候给出的,定义的时候不用给。

那么可能有很多人会问,缺省参数有什么用?

下面给出一个半缺省的例子:

struct Stack
{
    int* a;
    int top;
    int capacity;
}

void StackInit(struct Stack* ps, int n = 4)
{
    assert(ps);
    ps->a = (int*)malloc(sizeof(int) * n);
    ps->top = 0;
    ps->capacity = n;
}

int main()
{
    struct Stack st;
    StackInit(&st, 100);
    return 0;
}

五、函数重载

要求:函数名相同,函数参数不同,指的是参数个数/类型/顺序不同(形参类型顺序),注意哦,不关返回值类型的事哦。

C语言不支持同名函数,但是C++支持

比如:

int Add(int left, int right)
{
    return left + right;
}

double Add(double left, double right)
{
    return left + right;
}

函数重载这部分内容很重要,在面试的时候经常考察,比如下面几道面试题:

  1. 下面两个函数能形成重载吗?有什么问题或者在什么情况下会出现问题?

    void TestFunc(int a = 10)
    {
        cout << "void TestFunc(int)" << endl;
    }
    
    void TestFunc(int a)
    {
        cout << "void TestFunc(int)" << endl;
    }
    
  2. C语言中为什么不能支持函数重载?

  3. C++中函数重载底层是怎么处理的?

  4. C++中能否将一个函数按照C语言的风格来编译?

这些问题在下一篇博文中详细讲解哦,敬请期待吧。


六、遇见安然遇见你,不负代码不负卿

话题挑战赛正式开始啦,期待您的加入,一同瓜分千元奖金!
模板:大学学习月/季度总结
高效学习C++基础部分&话题挑战赛_第6张图片

你可能感兴趣的