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

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

@[Toc]

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

开始入坑C++了,嗐,说实话细节有好多,怎么说呢,我相信,今天是灰色的,明天是灰色的,后天一定是美好的,加油吧少年们。

在开始之前嘞,先向大家介绍目前官方大力支持的一项活动:话题挑战赛第1期一个人走,可能走的很快,但一群人走,将走的更远,以来路作灯,共同成长,展现技术人风采!

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

一、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<stdio.h>

 

intrand=0;

 

intmain()

{

   printf("%d\n", rand);

   return0;

}

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

#include<stdio.h>

#include<stdlib.h>

 

intrand=0;

 

intmain()

{

   printf("%d\n", rand);

   return0;

}

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ws5dZTJv-1652085076490)(C:\Users\macbook\AppData\Roaming\Typora\typora-user-images\image-20220430205402762.png)]](https://ucc.alicdn.com/images/user-upload-01/a528458ca3e64e1bb0eecf0c50c2684c.png)

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

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

那怎么改才是对的呢?

#include<stdio.h>

#include<stdlib.h>

 

namespaceSL//命名空间域

{

   intrand=0;

}

 

intmain()

{

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

   return0;

}

1.命名空间的定义

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

普通命名空间的定义

namespaceSL//SL为命名空间的名称

{

    //命名空间中的内容,即可以定义变量、函数、还可以定义类型

    inta=0;

    intAdd(intx, inty)

    {

        returnx+y;

    }

    structNode

    {

       intval;

        structNode*next;

    };

}

 

命名空间支持嵌套和重名

   namespacebyte

   {

       inta=0;

       namespacedata//命名空间可以嵌套,一般多是2~3层

       {

           structNode

           {

               intval;

               structNode*next;

           };

       }

   }

 

   //在同一工程中允许存在多个相同名称的命名空间,编译器最后会合并在同一个命名空间中

   namespacebyte

   {

       intb=0;

       namespacecache

       {

           structNode

           {

               intval;

               structNode*next;

           }

       }

   }

注意:

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

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

总结:

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

2.命名空间的使用

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

usingnamespacebyte;

 

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

usingnamespacedata;

 

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

usingnamespacebyte::cache;

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

usingnamespacebyte;//全部放出来

 

usingnamespacebyte::a;//部分放出来

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

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

std::cout<<byte::a<<std::endl;

  • 使用using将命名空间中成员引入(通常用来放部分常用的)

usingstd::cout;

usingstd::endl;

usingbyte::a;

    cout<<a<<endl;

    cout<<byte::b<<endl;

  • 使用using namespace命名空间引入(放了全部)

usingnamespacebyte;

usingnamespacestd;

//std是C++标准库的命名空间,全部放出来虽然方便使用了,但是存在冲突风险,所以我们平时在写一些练习不在乎冲突的时候,可以将它全部放出来,正常情况下没必要全部放出来


三、C++输入&输出

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

#include<iostream>

usingstd::cout;

usingstd::endl;

 

intmain()

{

   cout<<"Hello World!"<<endl;

   return0;

}

说明:

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

四、缺省参数/默认参数

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

1.缺省参数的定义

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

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

voidTestFunc(inta=0)

{

   cout<<a<<endl;

}

 

intmain()

{

   TestFunc();//没有传参时,使用参数的默认值

   TestFunc(10);//传参时,使用指定的实参

   return0;

}

2.缺省参数分类

I.全缺省参数

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

voidTestFunc(inta=10, intb=20, intc=30)

{

   cout<<"a = "<<a<<endl;

   cout<<"c = "<<c<<endl;

}

II.半缺省参数

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

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

voidTestFunc(inta, intb=10, intc=20)

{

   ...

}

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

voidTestFunc(inta=10, intb, intc=20)

{

   ...

}

注意:

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

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

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

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

structStack

{

   int*a;

   inttop;

   intcapacity;

}

 

voidStackInit(structStack*ps, intn=4)

{

   assert(ps);

   ps->a= (int*)malloc(sizeof(int) *n);

   ps->top=0;

   ps->capacity=n;

}

 

intmain()

{

   structStackst;

   StackInit(&st, 100);

   return0;

}

五、函数重载

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

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

比如:

intAdd(intleft, intright)

{

   returnleft+right;

}

 

doubleAdd(doubleleft, doubleright)

{

   returnleft+right;

}

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

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

voidTestFunc(inta=10)

{

   cout<<"void TestFunc(int)"<<endl;

}

 

voidTestFunc(inta)

{

   cout<<"void TestFunc(int)"<<endl;

}

  1. C语言中为什么不能支持函数重载?
  2. C++中函数重载底层是怎么处理的?
  3. C++中能否将一个函数按照C语言的风格来编译?

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


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

话题挑战赛正式开始啦,期待您的加入,一同瓜分千元奖金!模板:大学学习月/季度总结

相关文章
|
6天前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
27 4
2023/11/10学习记录-C/C++对称分组加密DES
|
4月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
92 0
|
2月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
2月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
28 1
|
5月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
5月前
|
人工智能 分布式计算 Java
【C++入门 一 】学习C++背景、开启C++奇妙之旅
【C++入门 一 】学习C++背景、开启C++奇妙之旅
|
5月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
|
5月前
|
小程序 C++
【C++入门 二 】学习使用C++命名空间及其展开
【C++入门 二 】学习使用C++命名空间及其展开
|
5月前
|
C++
C++基础知识(四:类的学习)
类指的就是对同一类对象,把所有的属性都封装起来,你也可以把类看成一个高级版的结构体。
|
5月前
|
算法 C++ 容器