【C++】C++基础语法(上)

简介: C++基础语法呢,有非常多的细节,需要大家慢慢来摸索,仔细的回顾,反复的复习

一、C++关键字(C++98)

在C语言的基础上多加了C语言没有的关键字,到后期边使用边学习,先大概看一眼!!

二、命名空间

1.由来

    当我们定义一个变量时,会不会偶尔和库里面的函数名字相同??


    当我们协同完成一个项目时,你定义的变量会不会与其他人定义的变量名冲突???


    当然会,所以就会出现命名空间这个词,在学习命名空间前呢,我们得先了解一个关键字 namespace.


举例说明:

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
 printf("%d\n", rand);
return 0; }
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

这个例子就是 rand于库函数中的rand函数重名,导致重定义

C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决

2.定义

1.定义和初步了解

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

namespace +命名空间的名字

{

   // 命名空间中可以定义变量  /  函数  /  类型

   //...... ;  

}

这是什么意思呢?

在使用变量时,默认查找规则:先局部,再全局


图一是创建了命名空间bit,这会打乱默认查找规则,会直接到定义的rand的命名空间中找,即先找指定,所以输出的为10,且   命名空间名  +  : : +变量名/函数/类型,为域作用限定符,这样规定格式。


图二则是没使用域作用限定符,会首先找局部,局部没有找全局,全局就是库函数中的rand函数了,所以是随机值。


注意:若命名空间中,定义了结构体,域作用用符的使用是这样的:struct bit:: Node

namespace bit
{
  int rand = 10;
  int x = 1;
     int Add(int left, int right)
    {
    return left + right;
  }
  struct Node
  {
    struct Node* next;
    int val;
  };
}
int main()
{
   //结构体
   struct bit::Node list;
   //函数和其他变量
   bit::Add();
   bit::rand=5;
}

那么加了namespace和直接定义到外面当全局,有什么区别呢?

那就是为了防止命名冲突,加了namespace就相当于加了一堵围墙,别人不可以随意的访问里面的内容,只能通过 bit::这把钥匙来访问。


2.命名空间的嵌套

命名空间可以嵌套多层

namespace N1
{
  int a;  //全局变量   在命名空间中,只有在自定义函数中,才是局部变量。其他是全局变量
  int b;  //全局变量
  int Add(int left, int right)
  {
    return left + right;
  }
  namespace N2
  {
    int c;  //全局变量
    int d;  //全局变量
    int Sub(int left, int right)
    {
      return left - right;
    }
  }
}
int main()
{
  N1::a=10;
  N1::N2::c=100;
}

对于多层嵌套的命名空间用法就是这样的。

3.同一文件命名空间名相同时

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

就比如在官方库中,多个文件会定义相同的命名空间名,在Queue.h中,定义的为 bit,

在Stack.h中,也是定义的bit,这会冲突吗??

当然不会!!


在test.cpp中,调用那他们时,会在预处理阶段,将头文件展开,会直接合并命名空间名相同的命名空间!


4.std官方库定义的命名空间

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

C++中,我们使用的函数都在std命名空间里,所以在我们使用时,经常会这样:

在使用时,会反反复复的去写域作用限定符,所以为了避免重复,c++就新出现 using namespace std;什么意思呢??


之前我们说,命名空间就像围墙,把里面的东西围起来,需要钥匙打开,才可以使用里面的内容,


于是  using namespace std;  就相当于把隔离围墙放开了,这下所有人都可以使用了,就还会出现 命名冲突,但是我们也可以把频率较高使用的单独放开围墙,这样我们就不需要重复去写


cout是c++中的输出,相当于c的printf,所以将其单独放开的话,就是这样的:using std::cout;

你懂了吗??

当然,全部展开using namespace std是我们平时自己联系敲代码的时候可以这样!!


三、C++的输入和输出

1.使用 cout 标准输出对象 ( 控制台 )和 cin 标准输入对象 ( 键盘 )时,必须 包含 < iostream > 头文件

以及按命名空间使用方法使用std。

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

iostream >头文件中。

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

4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。

C++的输入输出可以自动识别变量类型。

直接举例:

int main()
{
    int a;
    cout << "请输入一个数字,按回车结束" << endl;
    //printf("请输入一个数字,按回车结束\n")
    cin >> a;
    //scanf("%d",&a);
    cout << a << endl;
   //printf("%d", a);
    return 0;
}

四、缺省参数

1.定义

缺省参数是 声明或定义函数时为函数的 参数指定一个缺省值。在调用该函数时,如果没有指定实

参则采用该形参的缺省值,否则使用指定的实参。


func 函数中的参数int a=10则为缺省参数,缺省参数的值是可以变的,没有指定参数时,会使用缺省参数,否则使用指定的实参。

2.分类

缺省参数分为半缺省和全缺省,当然半缺省不是缺省一半的参数,半缺省必须传一个参数值,而全缺省不需要传值。


半缺省(部分缺省),缺省参数只能从右向左连续缺省:


void Func(int a,int b,int c =10)  可以  


void Func(int a,int b=10,int c)   不可以


void Func(int a,int b=10,int c=100)  可以


传参时,从左往右给:


void Func(int a,int b,int c =10)


Func(10,100);


3.缺省值在声明和定义中

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

在 .h中,void Func(int a=10) ;

在.cpp中,void Func(int a=100) {;}

若出现声明和定义中都有,那就会出现分歧,当声明和定义中都有, 规定缺省值只能在声明中出现

在 .h中,void Func(int a=10) ;

在.cpp中,void Func() {;}  // 可以

五、函数重载

在C语言中,我们会出现这种情况:

int Add(int m, int n)
{
    return m + n;
}
double Add(double m, double n)
{
    return m + n;
}
int main()
{
     int a=9;   //a=9.99
     int b=10;  //b=8.88
     Add(a,b);
}

对于同样的函数功能,当参数类型不同的时候,我们需要再去写一个函数,而且还不能同名,如果重名,编译器不会通过,但如果在C++中,就可以使用,这叫做 函数重载。



目录
相关文章
|
3月前
|
Java C# C++
C++ 11新特性之语法甜点1
C++ 11新特性之语法甜点1
36 4
|
3月前
|
编译器 C++ 容器
C++ 11新特性之语法甜点2
C++ 11新特性之语法甜点2
33 1
|
3月前
|
存储 算法 编译器
C++ 11新特性之语法甜点4
C++ 11新特性之语法甜点4
30 0
|
3月前
|
安全 C++ 容器
C++ 11新特性之语法甜点3
C++ 11新特性之语法甜点3
40 0
|
4月前
|
编译器 C++ 容器
C++语言的基本语法
想掌握一门编程语言,第一步就是需要熟悉基本的环境,然后就是最重要的语法知识。 C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。 对象 - 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。 类 - 类可以定义为描述对象行为/状态的模板/蓝图。 方法 - 从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。 即时变量 - 每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。 完整关键字
|
5月前
|
Java 编译器 程序员
C++中的语法知识虚继承和虚基类
**C++中的多继承可能导致命名冲突和数据冗余,尤其在菱形继承中。为解决这一问题,C++引入了虚继承(virtual inheritance),确保派生类只保留虚基类的一份实例,消除二义性。虚继承通过`virtual`关键字指定,允许明确访问特定路径上的成员,如`B::m_a`或`C::m_a`。这样,即使基类在继承链中多次出现,也只有一份成员副本,简化了内存布局并避免冲突。虚继承应在需要时提前在继承声明中指定,影响到从虚基类派生的所有后代类。**
|
5月前
|
编译器 C++ 开发者
C++一分钟之-属性(attributes)与属性语法
【7月更文挑战第3天】C++的属性(attributes)自C++11起允许附加编译器指令,如`[[nodiscard]]`和`[[maybe_unused]]`,影响优化和警告。注意属性放置、兼容性和适度使用,以确保代码清晰和可移植。示例展示了如何使用属性来提示编译器处理返回值和未使用变量,以及利用编译器扩展进行自动清理。属性是提升代码质量的工具,但应谨慎使用。
170 13
|
6月前
|
编译器 程序员 C++
C++一分钟之-属性(attributed)与属性语法
【6月更文挑战第28天】C++的属性为代码添加元数据,帮助编译器理解意图。C++11引入属性语法`[[attribute]]`,但支持取决于编译器。常见属性如`nodiscard`提示检查返回值,`maybe_unused`防止未使用警告。问题包括兼容性、过度依赖和误用。使用属性时需谨慎,确保团队共识,适时更新以适应C++新特性。通过示例展示了`nodiscard`和`likely/unlikely`的用法,强调正确使用属性能提升代码质量和性能。
96 13
|
6月前
|
编译器 C语言 C++