C++入门上(关键字、命名空间、输入输出、缺省参数、函数重载)

简介: C++入门上(关键字、命名空间、输入输出、缺省参数、函数重载)

😜前言😜

C++是在C语言的基础上,容纳进去了面向对象编程思想,并增加了许多库,以及编程范式等。


😛C++关键字😛

C++总计63个关键字,C语言32个关键字

C++关键字>


1686204028488.png

🐸 命名空间 🐸

假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等。


同样的情况也出现在 C++ 应用程序中。例如,您可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz()。这样,编译器就无法判断您所使用的是哪一个 xyz() 函数。


因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。


我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。


115b758a279b80e1a3c16f6906bc5a80.jpg我们来举个例子>

#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main()
{
  printf("%d",rand);
  return 0;
}


这段代码正常逻辑会打印‘10’,我们来运行一下看看>


c5849d26b48a4009861d9c9dc917b603.png


我们可以看到代码出现错误了,报错显示rand重定义,这是因为rand与<stdlib.h>中的rand函数重名了,所以编译器才会给出报错。

那么为了结果以上这种问题我们来引入命名空间。

命名空间的定义

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

来看代码>

1. namespace name {
2. // 代码声明
3. }

代码声明 可以定义属于name空间域的变量,如果需要访问name空间域的变量或函数则需要>

1. name::code;  // code 可以是变量或函数
2. //::是域作用限定符

再来看具体的实例>

#include <iostream>
using namespace std;
// 第一个命名空间
namespace first_space {
    void func() {
        cout << "first_space" << endl;
    }
}
// 第二个命名空间
namespace second_space {
    void func() {
        cout << "second_space" << endl;
    }
}
int main()
{
    // 调用第一个命名空间中的函数
    first_space::func();
    // 调用第二个命名空间中的函数
    second_space::func();
    return 0;
}


代码执行结果>


d5362b8b17c54664a7a52d65917e0aed.png


当然命名空间域也可以嵌套定义>


//命名空间嵌套
namespace N1
{
    int a = 0;
    int b;
    int Add(int left, int right)
    {
        return left + right;
    }
    namespace N2
    {
        int a = 1;
        int c;
        int d;
        int Sub(int left, int right)
        {
            return left - right;
        }
    }
}
int main()
{
    //访问N1里的变量
    printf("%d\n", N1::Add(1, 2));
    //访问N1里的N2的变量
    printf("%d\n", N1::N2::Sub(5,4));
    return 0;
}


4585161f05114efa9fa016c56a8073cf.png

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


ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个


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


命名空间的使用"using指令"

我们有这么一段代码>

namespace N
{
  // 命名空间中可以定义变量/函数/类型
  int a = 0;
  int b = 1;
  int Add(int left, int right)
  {
    return left + right;
  }
  struct Node
  {
    struct Node* next;
    int val;
  };
}


如果我们想要访问里面的变量a我们可以通过以下3种方法来进行访问。

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


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

2.使用using将命名空间中a成员引入

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

3.使用using namespace 命名空间名称 引入

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


小结:

int a = 1;
namespace XZ {
  int a = 10;
}
int main()
{
  int a = 0;
  printf("%d\n", a);    //访问局部变量
  // ::域作用限定域
  printf("%d\n",::a);   //访问全局变量
  printf("%d\n", XZ::a);//访问命名空间变量
  return 0;
}

变量作用域访问的先后顺序是:局部域->全局域 -> 展开了命名空间域 or 指定访问命名空间域


😺C++输入&输出😺

C++ 标准库提供了一组丰富的输入/输出功能,C++ 的 I/O 发生在流中,流是字节序列。如果字节流是从设备(如键盘、磁盘驱动器、网络连接等)流向内存,这叫做输入操作。如果字节流是从内存流向设备(如显示屏、打印机、磁盘驱动器、网络连接等),这叫做输出操作。


C++输出

#include <iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
  char str[] = "Hello C++";
  cout << "Value of str is : " << str << endl;
}

上面的代码被编译和执行时,它会产生下列结果:

17014af6f8f545bebd96438db809c924.png


C++ 编译器根据要输出变量的数据类型,选择合适的流插入运算符来显示值。<< 运算符被重载来输出内置类型(整型、浮点型、double 型、字符串和指针)的数据项。

流插入运算符 << 在一个语句中可以多次使用,如上面实例中所示,endl 用于在行末添加一个换行符。

C++输入

#include <iostream>
using namespace std;
int main( )
{
   char name[50];
   cout << "请输入您的名称: ";
   cin >> name;
   cout << "您的名称是: " << name << endl;
}



b622ea5b0d204014b14af4f2d4432c2c.png

C++ 编译器根据要输入值的数据类型,选择合适的流提取运算符来提取值,并把它存储在给定的变量中。流提取运算符 >> 在一个语句中可以多次使用,如果要求输入多个数据,可以使用如下语句:

cin >> name >> age;


相当于:

1. cin >> name;
2. cin >> age;


std命名空间的使用惯例:


std是C++标准库的命名空间,如何展开std使用更合理呢?


在日常练习中,建议直接using namespace std即可,这样就很方便。

using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就 存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所 以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类 型等方式。  


😃缺省参数😃

什么是缺省参数?

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


#include<iostream>
using namespace std;
void Func(int a = 0)
{
  cout << a << endl;
}
int main()
{
  Func(); // 没有传参时,使用参数的默认值
  Func(10); // 传参时,使用指定的实参
  return 0;
}

运行结果>

f56c0c43e3c0429396a53a7ad10c2453.png


缺省参数的两种类型

  • 全缺省参数



//全缺省参数
void Func(int a = 10, int b = 20, int c = 30)
{
  cout << "a= " << a << endl;
  cout << "b= " << b << endl;
  cout << "c= " << c << endl;
  printf("\n");
}
int main()
{
  Func();
  Func(1);
  Func(1.2);
  Func(1, 2, 3);
  return 0;
}


e0b0715503094db4b896fb6239ac8bfc.png


  • 半缺省参数
//半缺省参数
void Func(int a, int b = 10, int c = 20)
{
  cout << "a= " << a << endl;
  cout << "b= " << b << endl;
  cout << "c= " << c << endl;
  printf("\n");
}
int main()
{
  Func(0);
  Func(0, 1);
  Func(0, 1, 2);
  return 0;
}


d763b59b686f48b89643d1c2c16c2b66.png


总结:

  1. 半缺省参数必须从右王座一次来给出,不能间隔着给
  2. 缺省参数不能再函数声明和定义中同时出现(在声明中)
  3. 缺省参数必须是常量或者全局变量


🙈函数重载🙈

什么是函数重载?

函数重载:是函数一种特殊的情况,c++中允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数/类型/类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

函数重载的几种形式

1.参数个数不同

//1.参数个数不同
int Func()
{
  return -1;
}
int Func(int x)
{
  return x;
}
int Func(int x, int y)
{
  return x + y;
}
int main()
{
  cout << Func() << endl;
  cout << Func(5) << endl;
  cout << Func(1,2) << endl;
  return 0;
}


99c012f918aa49bb84cfdbede579e09c.png

2.参数类型不同

//2.参数类型不同
int Add(int x, int y)
{
  cout << "int Add(int x, int y)" << endl;
  return x + y;
}
double Add(double x, double y)
{
  cout << "double Add(double x,double y)" << endl;
  return x + y;
}
int main()
{
  cout << Add(1, 2) << endl;
  cout << Add(1.1, 1.2) << endl;
  return 0;
}


d2bf456387f741248846b04fa8825e7c.png


3.参数类型顺序不同

//3.参数类型顺序不同
void f(int x, char y)
{
  cout << "void f(int x,char y)" << endl;
}
void f(char x, int y)
{
  cout << "void f(char x,int y)" << endl;
}
int main()
{
  f(1, 1.1);
  f(1.1, 1);
  return 0;
}


f8e3e5102c7d47d594863b4a8aeeae38.png


🍀小结🍀

今天我们认识了C++关键字、学习了命名空间、输入输出、缺省函数、函数重载相信大家看完有一定的收获。

相关文章
|
4月前
|
存储 安全 编译器
c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
56 0
|
7月前
|
存储 分布式计算 编译器
C++入门基础2
本内容主要讲解C++中的引用、inline函数和nullptr。引用是变量的别名,与原变量共享内存,定义时需初始化且不可更改指向对象,适用于传参和返回值以提高效率;const引用可增强代码灵活性。Inline函数通过展开提高效率,但是否展开由编译器决定,不建议分离声明与定义。Nullptr用于指针赋空,取代C语言中的NULL。最后鼓励持续学习,精进技能,提升竞争力。
|
8月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
4月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
116 0
|
4月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
191 0
|
6月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
243 12
|
7月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
144 16
|
8月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
7月前
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。
|
7月前
|
存储 编译器 C++
类和对象(上)(C++)
本篇内容主要讲解了C++中类的相关知识,包括类的定义、实例化及this指针的作用。详细说明了类的定义格式、成员函数默认为inline、访问限定符(public、protected、private)的使用规则,以及class与struct的区别。同时分析了类实例化的概念,对象大小的计算规则和内存对齐原则。最后介绍了this指针的工作机制,解释了成员函数如何通过隐含的this指针区分不同对象的数据。这些知识点帮助我们更好地理解C++中类的封装性和对象的实现原理。

热门文章

最新文章