深入计算机语言之C++:C到C++的过度-1

简介: 深入计算机语言之C++:C到C++的过度-1

一、什么是C++

C++(c plus plus)是一种计算机高级程序设计语言,由C语言扩展升级而产生 ,最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。


我们之前学习的C语言就是一种面向过程的语言,它强调事件的具体实现过程,一般以函数来具体实现。C++就是一门典型的面向对象的语言,它将问题分成多个对象,更强调对象与对象之间的联系。它完善了C语言的许多缺陷,并且引入了面向对象的程序设计思想,包括面向对象的四个特性:封装,继承,多态,抽象。  


无论是面向过程还是面向对象的语言,都有其优缺点:

面向过程 面向对象
优点 流程化分工明确,效率高 结构化更清晰,易维护
缺点 可维护性差,扩展能力差 开销大,性能低


二、C++的标准库

标准的 C++ 由三个重要部分组成:

  • 核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。
  • C++ 标准库,提供了大量的函数,用于操作文件、字符串等。
  • 标准模板库(STL),提供了大量的方法,用于操作数据结构等。


这三个部分包含了C++这门语言的核心,我们后面的内容就主要围绕上面三个部分展开。


三、第一个C++程序

C++兼容C语言的大多数语法,所以C语言实现的 hello world 依旧可以运行,C++中需要把定义文件代码后缀改成.cpp,vs编译器看到是.cpp就会调用C++编译器,Linux下亚勇g++编译,不再是gcc。


当然C++有一套自己的输入输出,严格说C++版本的 hello world 应该是这么写:

// test.cpp 
// 这⾥的std cout等我们都看不懂,没关系,下⾯我们会依次讲解 
#include<iostream> 
using namespace std;
 
int main() 
{
    cout << "hello world\n" << endl;
 
    return 0;
}


四、命名空间

4.1 域作用限定符

作用域限定符:  " : ",其作用是通知编译器应从作用域限定符左侧的名字所示的作用域中寻找右侧那个名字,即指定访问哪个名字空间的哪个成员。当左侧为空时,默认访问的就是全局域。

#include<iostream>
 
int a = 1;
 
int main()
{
  int a = 0;
 
  printf("%d\n", a);
  printf("%d\n", ::a);
 
  return 0;
}


我们知道C语言遵循局部优先的规则,即当局部变量与全局变量冲突时,默认使用局部变量。而在C++中,我们可以通过域作用限定符来访问全局变量。

输出结果为:

0

1


4.2 为什么要存在命名空间

在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全 局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。


c语⾔项⽬类似下⾯程序这样的命名冲突是普遍存在的问题,C++引⼊namespace就是为了更好的解决这样的问题

#include<iostream>
#include<stdlib.h>
int rand = 1;
int main()
{
    printf("%d\n", rand);
    return 0;
}


当我们定义rand变量时,就会与stdlib库中的rand函数出现命名冲突,这在C语言中只能通过修改变量名称来解决。但是在C++中,我们可以就可以使用命名空间来解决。


4.3 命名空间的定义

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


C++标准库都放在⼀个叫std(standard)的命名空间中。


4.3.1 正常的命名空间定义

namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。

#include<iostream>
#include<stdlib.h>
namespace ake
{
  int rand = 1;
}
int main()
{
  printf("%d\n", ake::rand);
  //使用域作用限定符,指定作用域
  return 0;
}


输出结果为 :1

4.3.2 命名空间的嵌套定义

namespace只能定义在全局,当然他还可以嵌套定义。

#include<iostream>
using namespace std;
namespace ake1
{
  int a = 1;
  namespace ake2//嵌套
  {
    int Add(int a, int b)
    {
      return a + b;
    }
  }
}
int main()
{
  cout << ake1::a << endl;
  //访问通过限定符依次访问
  cout << ake1::ake2::Add(1, 1) << endl;
  return 0;
}


4.3.3 多文件中同名定义合并

在同一个工程中(可以是同一个工程下的不同文件),我们可以定义多个名称相同的命名空间,在编译时命名空间会自动合并,认为是⼀个namespace,不会冲突。

namespace ake
{
  int a = 1;
}
namespace ake
{
  int b = 1;
}
//编译时会自动合并


4.4 命名空间的使用

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以 下⾯程序会编译报错。所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:


4.4.1 指定命名空间访问

这我们在前面已经实验演示过,现在我们来演示一下访问C++标准命名空间。(cout,endl等常用函数都被定义在C++标准命名空间std中)。

#include<iostream>
int main()
{
  std::cout << "hello bite" << std::endl;
  return 0;
}

指定命名空间访问,项⽬中推荐这种⽅式。

4.4.2 using 部分展开

在我们书写代码时,可能会频繁调用某个函数,这是我们可以使用using部分展开,来简化代码。使用方式为using 命名空间名称:: 成员。

#include<iostream>
#include<stdlib.h>
namespace ake
{
  int a = 1;
    int b = 2;
}
 
using ask::a;
 
int main()
{
  printf("%d\n", a);
    printf("%d\n", a);
    printf("%d\n", a);
    printf("%d\n", a);
    printf("%d\n", ake::b);
  
  return 0;
}

项⽬中经常访问的不存在冲突的成员推荐这种⽅式

4.4.3 using namespace 全部展开

除了部分展开,自然也有全局展开。其格式为using namespace 命名空间名

#include<iostream>
#include<stdlib.h>
namespace ake
{
  int a = 1;
    int b = 2;
}
 
using namespace ask;
 
int main()
{
  printf("%d\n", a);
    printf("%d\n", b);
  
  return 0;
}

展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。

五、C++的输入和输出

C++的标准输入与输出函数是cin与cout,分别对应C语言的printf与scanf。但是相较于C语言,C++输入输出并不需要指定占位符,如:%d,%c等,输出可以⾃动识别变量类型

#include<iostream>
using namespace std;//展开命名空间
int main()
{
  cout << "hello world" << endl;
  //endl相当于换行符
  cout << "hello world" << '\n';
  cout << 'a' << endl;
  int b = 1;
  cout << b << endl;
  cout << &b << endl;
  return 0;
}


注:在C++中使用 cin 与 cout 以及 endl 都属于C++标准库,需要包含头文件iostream以及std标准命名空间。

六、缺省参数

6.1 缺省参数的使用

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

void func(int a = 0)
{
  cout << a << endl;
}
int main()
{
  func();  // 没有传参时,使用参数的默认值,输出0
  func(1); // 传参时,使用指定的实参,输出1
  return 0;
}


运行结果:

0

1

6.2 缺省参数的分类

根据其缺省参数的个数,我们我可以将缺省参数分为全缺省半缺省。

6.2.1 全缺省

每一个参数都有缺省值。

#include<iostream>
using namespace std;
void func(int a = 0, int b = 1, int c = 2)
{
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;
  cout << "c = " << c << endl << endl;;
}
int main()
{
  func();//不穿参数
  func(10, 20);//半传参数
  func(10, 20, 30);//全传
  return 0;
}
 

6.2.2 半缺省

只有一部分参数有缺省值,并且半缺省参数必须从右往左依次来给出,不能间隔着给。同时传参只能从左往右依次传参。

#include<iostream>
using namespace std;
void func(int a ,int b=1,int c=2)
{
  cout <<"a = " << a << endl;
  cout << "b = " << b << endl;
  cout << "c = " << c << endl;
}
int main()
{
 
  func(10,20);//半传参数
  cout << endl;
  func(10, 20, 30);//全传
  return 0;
}

5.2.3 注意

在使用缺省参数时,我们也要知道一些注意事项:

1. 传参时不能间隔传参

void func(int a ,int b=1,int c=2)
{
  cout <<"a = " << a << endl;
  cout << "b = " << b << endl;
  cout << "c = " << c << endl;
}
func(,10,20)//error


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

1. //test.h
2. void Func(int a = 10);//声明
3. // test.cpp
4. void Func(int a = 20)//定义
5. {}


深入计算机语言之C++:C到C++的过度-2

https://developer.aliyun.com/article/1624613

相关文章
|
4月前
|
C++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
76 2
|
4月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
86 0
|
2月前
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
50 5
|
2月前
|
存储 编译器 C语言
深入计算机语言之C++:类与对象(上)
深入计算机语言之C++:类与对象(上)
|
2月前
|
存储 分布式计算 编译器
深入计算机语言之C++:C到C++的过度-2
深入计算机语言之C++:C到C++的过度-2
|
3月前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
25 0
|
4月前
|
编译器 C++ 容器
C++语言的基本语法
想掌握一门编程语言,第一步就是需要熟悉基本的环境,然后就是最重要的语法知识。 C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。 对象 - 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。 类 - 类可以定义为描述对象行为/状态的模板/蓝图。 方法 - 从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。 即时变量 - 每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。 完整关键字
|
5月前
|
前端开发 编译器 程序员
协程问题之为什么 C++20 的协程代码比其他语言的协程 demo 长很多如何解决
协程问题之为什么 C++20 的协程代码比其他语言的协程 demo 长很多如何解决
|
12天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
25 2
|
19天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
53 5