C++(区别于C的)基础内容总结

avatar
作者
筋斗云
阅读量:0

参考:

C++ 教程 | 菜鸟教程 (runoob.com)

简介

C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点。

C++ 是由 Bjarne Stroustrup 于 1979 年在新泽西州美利山贝尔实验室开始设计开发的。C++ 进一步扩充和完善了 C 语言,最初命名为带类的C,后来在 1983 年更名为 C++。

C++ 程序的源文件通常使用扩展名 .cpp、.cp 、.cc或 .c。

面向对象程序设计

C++ 完全支持面向对象的程序设计,包括面向对象开发的四大特性:

  • 封装(Encapsulation):封装是将数据和方法组合在一起,对外部隐藏实现细节,只公开对外提供的接口。这样可以提高安全性、可靠性和灵活性。

  • 继承(Inheritance):继承是从已有类中派生出新类,新类具有已有类的属性和方法,并且可以扩展或修改这些属性和方法。这样可以提高代码的复用性和可扩展性。

  • 多态(Polymorphism):多态是指同一种操作作用于不同的对象,可以有不同的解释和实现。它可以通过接口或继承实现,可以提高代码的灵活性和可读性。

  • 抽象(Abstraction):抽象是从具体的实例中提取共同的特征,形成抽象类或接口,以便于代码的复用和扩展。抽象类和接口可以让程序员专注于高层次的设计和业务逻辑,而不必关注底层的实现细节。

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

  • 核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。

  • C++ 标准库,提供了大量的函数,用于操作文件、字符串等。

  • 标准模板库(STL),提供了大量的方法,用于操作数据结构等。

如果您使用的是 Linux 或 UNIX,请在命令行使用下面的命令来检查您的系统上是否安装了 GCC:

$ g++ -v

程序 g++ 是将 gcc 默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。

c语言编译使用gcc,c++编译使用g++

比如多个 C++ 代码文件,如 runoob1.cpp、runoob2.cpp,编译命令如下:

g++ runoob1.cpp runoob2.cpp -o runoob

生成一个 runoob 可执行文件。

C++ 程序结构

让我们看一段简单的代码,可以输出单词 Hello World

#include <iostream> using namespace std;   // main() 是程序开始执行的地方   int main() {    cout << "Hello World"; // 输出 Hello World    return 0; }

接下来我们讲解一下上面这段程序:

  • C++ 语言定义了一些头文件,这些头文件包含了程序中必需的或有用的信息。上面这段程序中,包含了头文件 <iostream>

  • 下一行 using namespace std; 告诉编译器使用 std 命名空间。命名空间是 C++ 中一个相对新的概念。

  • 下一行 // main() 是程序开始执行的地方 是一个单行注释。单行注释以 // 开头,在行末结束。

  • 下一行 int main() 是主函数,程序从这里开始执行。

  • 下一行 cout << "Hello World"; 会在屏幕上显示消息 "Hello World"。

  • 下一行 return 0; 终止 main( )函数,并向调用进程返回值 0。

以下主要说明C++和C不一样的一些基础语法。

其实,大体上来说,C++=C语言+面向对象。

基本的内置类型

C++ 为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。下表列出了七种基本的 C++ 数据类型:

其实 wchar_t 是这样来的:

typedef short int wchar_t;

所以 wchar_t 实际上的空间是和 short int 一样。

类型转换

类型转换是将一个数据类型的值转换为另一种数据类型的值。

C++ 中有四种类型转换:静态转换、动态转换、常量转换和重新解释转换。

静态转换(Static Cast)

静态转换是将一种数据类型的值强制转换为另一种数据类型的值。

静态转换通常用于比较类型相似的对象之间的转换,例如将 int 类型转换为 float 类型。

静态转换不进行任何运行时类型检查,因此可能会导致运行时错误。

实例

int i = 10;  float f = static_cast<float>(i); // 静态将int类型转换为float类型

动态转换(Dynamic Cast) 

动态转换通常用于将一个基类指针或引用转换为派生类指针或引用。动态转换在运行时进行类型检查,如果不能进行转换则返回空指针或引发异常。

实例

class Base {}; class Derived : public Base {}; Base* ptr_base = new Derived; Derived* ptr_derived = dynamic_cast<Derived*>(ptr_base); // 将基类指针转换为派生类指针

常量转换(Const Cast)

常量转换用于将 const 类型的对象转换为非 const 类型的对象。

常量转换只能用于转换掉 const 属性,不能改变对象的类型。

实例

const int i = 10;  int& r = const_cast<int&>(i); // 常量转换,将const int转换为int

重新解释转换(Reinterpret Cast)

重新解释转换将一个数据类型的值重新解释为另一个数据类型的值,通常用于在不同的数据类型之间进行转换。

重新解释转换不进行任何类型检查,因此可能会导致未定义的行为。

实例

int i = 10;  float f = reinterpret_cast<float&>(i); // 重新解释将int类型转换为float类型

函数参数默认值 

当您定义一个函数,您可以为参数列表中后边的每一个参数指定默认值。当调用函数时,如果实际参数的值留空,则使用这个默认值。

这是通过在函数定义中使用赋值运算符来为参数赋值的。调用函数时,如果未传递参数的值,则会使用默认值,如果指定了值,则会忽略默认值,使用传递的值。请看下面的实例:

#include <iostream> using namespace std;   int sum(int a, int b=20) {   int result;     result = a + b;      return (result); }   int main () {    // 局部变量声明    int a = 100;    int b = 200;    int result;      // 调用函数来添加值    result = sum(a, b);    cout << "Total value is :" << result << endl;      // 再次调用函数    result = sum(a);    cout << "Total value is :" << result << endl;      return 0; }

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

Total value is :300  Total value is :120

C++ 字符串 

C++ 提供了以下两种类型的字符串表示形式:

  • C 风格字符串

  • C++ 引入的 string 类类型

C 风格字符串,略。

C++ 中的 String 类

C++ 标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能。我们将学习 C++ 标准库中的这个类,现在让我们先来看看下面这个实例:

#include <iostream> #include <string>   using namespace std;   int main () {    string str1 = "runoob";    string str2 = "google";    string str3;    int  len ;      // 复制 str1 到 str3    str3 = str1;    cout << "str3 : " << str3 << endl;      // 连接 str1 和 str2    str3 = str1 + str2;    cout << "str1 + str2 : " << str3 << endl;      // 连接后,str3 的总长度    len = str3.size();    cout << "str3.size() :  " << len << endl;      return 0; }

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

str3 : runoob  str1 + str2 : runoobgoogle  str3.size() : 12

C++ 引用

引用变量其实是取一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。

C++ 引用 vs 指针 引用很容易与指针混淆,它们之间有三个主要的不同: 不存在空引用。引用必须连接到一块合法的内存。 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。 引用必须在创建时被初始化。指针可以在任何时间被初始化。 C++ 中创建引用 试想变量名称是变量附属在内存位置中的标签,您可以把引用当成是变量附属在内存位置中的第二个标签。因此,您可以通过原始变量名称或引用来访问变量的内容。

例如:

int i = 17;

我们可以为 i 声明引用变量,如下所示:
 

int& r = i;  double& s = d;

在这些声明中,& 读作引用。因此,第一个声明可以读作 "r 是一个初始化为 i 的整型引用",第二个声明可以读作 "s 是一个初始化为 d 的 double 型引用"。

下面的实例使用了 int 和 double 引用:

#include <iostream>   using namespace std;   int main () {    // 声明简单的变量    int    i;    double d;      // 声明引用变量    int&    r = i;    double& s = d;        i = 5;    cout << "Value of i : " << i << endl;    cout << "Value of i reference : " << r  << endl;      d = 11.7;    cout << "Value of d : " << d << endl;    cout << "Value of d reference : " << s  << endl;        return 0; }

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

Value of i : 5  Value of i reference : 5  Value of d : 11.7  Value of d reference : 11.7

引用通常用于函数参数列表和函数返回值。下面列出了 C++ 程序员必须清楚的两个与 C++ 引用相关的重要概念:

搞个引用有啥用?

参考:深入浅出C++引用(Reference)类型 - micemik - 博客园 (cnblogs.com)

要点1:为反复使用的冗长的变量名称定义一个简短的、易用的别名,从而简化了代码。通常,冗长的变量名称源于多层嵌套对象,例如类中定义嵌套类,类中定义其它类对象。

要点2:声明(定义)之后,无法再次指定作为其它变量的别名。

C++ 基本的输入输出

C++ 标准库提供了一组丰富的输入/输出功能,我们将在后续的章节进行介绍。本章将讨论 C++ 编程中最基本和最常见的 I/O 操作。

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

I/O 库头文件

下列的头文件在 C++ 编程中很重要。

标准输出流(cout)

预定义的对象 coutiostream 类的一个实例。cout 对象"连接"到标准输出设备,通常是显示屏。cout 是与流插入运算符 << 结合使用的,如下所示:

#include <iostream>   using namespace std;   int main( ) {    char str[] = "Hello C++";      cout << "Value of str is : " << str << endl; }

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

Value of str is : Hello C++

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

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

<<是个可重载的运算符,叫做流插入运算符,形象解释就是,想要输出啥,就往cout上输出即可。

比如:

输出结果如下:

所见即所得,输出时不需要使用什么符号来指定数据类型。

标准输入流(cin)

预定义的对象 ciniostream 类的一个实例。cin 对象附属到标准输入设备,通常是键盘。cin 是与流提取运算符 >> 结合使用的,如下所示:

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

当上面的代码被编译和执行时,它会提示用户输入名称。当用户输入一个值,并按回车键,就会看到下列结果:

请输入您的名称: cplusplus  您的名称是: cplusplus

C++ 编译器根据要输入值的数据类型,选择合适的流提取运算符来提取值,并把它存储在给定的变量中。

流提取运算符 >> 在一个语句中可以多次使用,如果要求输入多个数据,可以使用如下语句:

cin >> name >> age;

这相当于下面两个语句:

cin >> name;  cin >> age;

标准错误流(cerr)

预定义的对象 cerriostream 类的一个实例。cerr 对象附属到标准输出设备,通常也是显示屏,但是 cerr 对象是非缓冲的,且每个流插入到 cerr 都会立即输出。

cerr 也是与流插入运算符 << 结合使用的,如下所示:

#include <iostream>   using namespace std;   int main( ) {    char str[] = "Unable to read....";      cerr << "Error message : " << str << endl; }

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

Error message : Unable to read....

标准日志流(clog)

预定义的对象 clogiostream 类的一个实例。clog 对象附属到标准输出设备,通常也是显示屏,但是 clog 对象是缓冲的。这意味着每个流插入到 clog 都会先存储在缓冲区,直到缓冲填满或者缓冲区刷新时才会输出。

clog 也是与流插入运算符 << 结合使用的,如下所示:

#include <iostream>   using namespace std;   int main( ) {    char str[] = "Unable to read....";      clog << "Error message : " << str << endl; }

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

Error message : Unable to read....

通过这些小实例,我们无法区分 cout、cerr 和 clog 的差异,但在编写和执行大型程序时,它们之间的差异就变得非常明显。所以良好的编程实践告诉我们,使用 cerr 流来显示错误消息,而其他的日志消息则使用 clog 流来输出。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!