c++教程1快速入门

快速入门

欢迎来到令人兴奋的C++编程世界。本章将演示如何创建简单的C++程序,以及如何在程序中存储数据。

  • C++简介
  • 安装编译器
  • 编写第一个程序
  • 编译和运行程序
  • 创建变量
  • 使用变量数组
  • 使用向量数组
  • 声明常量

1.1 C++ 简介

C++是C编程语言的扩展,早在1972年由Dennis Ritchie首次在UNIX操作系统上实现。C是一种灵活的编程语言,至今仍很流行,被广泛应用于从微控制器到最先进的科学系统等各种平台。

[图片上传失败...(image-b32e85-1703646383660)]

C++是一种功能强大的编程语言(读作 "see plus plus"),

C++由Bjarne Stroustrup博士于1983年至1985年在新泽西州AT&T贝尔实验室工作期间开发。他在原始C语言的基础上增加了一些功能,开发出了他所称的"带类的C语言"。这些类定义了具有特定功能的编程对象,将C语言的过程性质转变为C++的面向对象编程语言。

C编程语言继承了1970年左右问世的名为"B"的早期编程语言。因为编程中的++递增运算符表示C++是C语言的扩展。

C++和C语言一样,不依赖于平台,因此可以在任何操作系统上创建程序。

1.1.1 为什么要学习C++编程?

C++语言受到许多专业程序员的青睐,因为它可以让他们创建快速、紧凑、健壮且可移植的程序。

使用现代C++集成开发环境 (IDE),如 Microsoft 的 Visual Studio Community Edition,程序员可以快速创建复杂的应用程序。但是,要想最大限度地使用这些工具,程序员必须首先学习一些有关C++语言本身的知识。

1.1.2 应该先学习C语言吗?

本书不假定读者以前掌握过任何编程语言,因此适合C++编程初学者,无论他们是否了解C语言。

如果您觉得在学习 C++ 之前先学习 C 语言编程会对您有所帮助,我们建议您在阅读本书之前先尝试一下《C 编程简易教程》中的示例。

1.1.3 C++的标准化

美国国家标准协会(ANSI)和工业标准化组织(ISO)的联合委员会定义了C++的标准版本。该版本有时被称为ANSI C++,可移植到任何平台和任何开发环境。

[图片上传失败...(image-f8536-1703646383660)]

[图片上传失败...(image-3f1425-1703646383660)]

参考资料

1.2安装编译器

C++程序最初以纯文本文件的形式创建,文件扩展名为".cpp"。这些文件可以用任何文本编辑器编写,如Windows的记事本程序或Linux上的Vi编辑器。

为了执行C++程序,必须首先将其“编译”成计算机可以理解的字节代码。 C++编译器读取程序的文本版本并将其转换为机器可读的可执行格式的第二个文件。

如果文本程序包含任何语法错误,编译器将报告这些错误,并且不会构建可执行文件。

如果您使用Windows平台并安装了C++集成开发环境 (IDE),那么您将已经拥有可用的C++编译器,因为编译器是可视化IDE的组成部分。 优秀的免费Microsoft Visual C++ Express IDE提供了编辑器窗口(可以在其中编写程序代码)以及用于编译和执行程序的按钮。 然而,在开始使用C++时,可视化IDE可能看起来很笨重,因为它们总是创建大量由高级程序使用的“项目”文件。

流行的免费GNU C++编译器可根据通用公共许可证 (GPL) 条款免费提供。 它包含在大多数Linux操作系统发行版中。 GNU C++编译器也可用于 Windows平台,并用于编译本书中的示例。

要了解系统上是否已安装 GNU C++编译器,请在命令提示符处键入c++ -v,然后按Return键。 如果可用,编译器将返回版本信息。

$ c++ -v
Using built-in specs.
COLLECT_GCC=c++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 11.4.0-1ubuntu1~22.04' --with-bugurl=file:///usr/share/doc/gcc-11/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-11 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-11-XeT9lY/gcc-11-11.4.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-11-XeT9lY/gcc-11-11.4.0/debian/tmp-gcn/usr --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)

GNU(发音为“guh-new”)项目于1984年启动,旨在开发一个完全免费的类Unix操作系统。 GNU的一部分是“Minimalist GNU for Windows”(MinGW)。 MinGW包括GNU C++编译器,可在Windows系统上使用它来创建可执行的C++程序。Windows用户可以按照此处的说明下载并安装GNU C++编译器。

GNU C++ 编译器可根据通用公共许可证 (GPL) 的条款和条件免费获得,该许可证可在线找到 gnu.org/copyleft/gpl.html。可在https://sourceforge.net/projects/mingw/files/latest/download下载MinGW安装程序mingw-get-setup.exe。

启动安装程序设置并接受“安装管理器”对话框中建议的 C:\MinGW位置

[图片上传失败...(image-b049b1-1703646383660)]

MinGW C++编译器是一个二进制可执行文件,位于C:\MinGW\bin。 为了允许从任何系统位置访问它,现在应该将该文件夹添加到系统路径。

1.3 编写第一个程序"Hello World!"

#include <iostream>
using namespace std;

int main()
{
        cout << "Hello World!" << endl;
        return 0;
}

执行:

$ g++ hello.cpp -o hello
$ ./hello
Hello World!

编译器会在原始源代码文件旁边创建可执行文件。默认情况下,该可执行文件在Windows系统中被命名为a.exe,在Linux中被命名为a.out。建议在编译程序时使用-o选项,为可执行文件指定名字。

  • 预处理指令 - 这些指令由编译器在程序代码之前处理,所以必须总是出现在页面的开头。这里,#include指示编译器使用名为iostream的标准C++输入/输出库,在< >角括号之间指定库名。下一行是"using指令",允许使用指定命名空间的函数,而不使用其命名空间前缀。iostream库的函数属于std命名空间--所以这个using指令允许诸如std::cout和std::endl的函数被简单地写成cout和endl。
  • 注释 在//双斜线之后单行中的所有内容都会被编译器忽略。
  • Main函数 - 这是每一个C++程序的必经之路。程序可以包含许多函数,但必须始终包含main的函数,否则编译器不会编译该程序。可以选择在函数名称后面的括号中指定逗号分隔的"参数"值列表,供该函数使用。main函数必须返回int。
    -语句 - 这些是程序运行时要执行的动作。语句必须以分号结束,。这里,第一条语句调用cout库函数来输出文本和回车符endl。这些都是由<<输出流操作符指向标准输出的。请注意,C++中的文本字符串必须总是包含在双引号中。最后一条语句使用了C++的return关键字来向操作系统返回零的整数值,传统上,返回零值表示程序成功执行。

C++编译器也支持在//-之间的多行C语言风格的注释。

1.4 变量

变量是容器,其中的数据值可以存储在计算机的内存中。存储的值可以用变量的名称来引用。

可以为变量选择任何名称,只要它遵守C++的命名规则--所选的名称只能包含字母、数字和下划线字符,但不能以数字开头。另外必须避免使用C++关键字。选择有意义的名字是很好的做法,可以使代码更容易理解。

创建变量必须进行"声明"(declared),指定它可能包含的数据类型和它选择的名称。变量声明有这样的语法。数据类型 变量名称;

在C++中,名称是区分大小写的--因此名为VAR、Var和var的变量被视为三个单独的变量。传统上,C++的变量名是小写的,很少以下划线开始,因为一些C++库使用这种惯例。
同一数据类型的多个变量可以在一个声明中以逗号分隔的列表形式创建,其语法:数据类型 变量名1, 变量名2, 变量名3 。
下表列出了五种基本的C++数据类型,并附有简要说明和示例内容。

char数据类型的字符值必须总是包含在单引号中,而不是双引号。
变量声明必须出现在可执行语句之前--这样它们就可以在语句中被引用。
"初始化"是把值分配给变量时。也可以在声明中对变量进行初始化。存储在任何初始化变量中的值可以通过cout函数显示在标准输出上。

vars.cpp

#include <iostream>
using namespace std;

int main()
{
  char letter; letter = 'A';
  int number; number = 100;
  float decimal = 7.5;
  double pi = 3.14159;
  bool isTrue = false;

  cout << "char letter: " << letter << endl;
  cout << "int number: " << number << endl;
  cout << "float decimal: " << decimal << endl;
  cout << "double pi: "  << pi << endl;
  cout << "bool isTrue: " << isTrue << endl;

  return 0;
}

执行:

$ g++ vars.cpp -o vars
$ ./vars
char letter: A
int number: 100
float decimal: 7.5
double pi: 3.14159
bool isTrue: 0

布尔变量名建议以"is"开头,这样它们就能立即被识别为布尔变量。另外,对所有由多个单词组成的变量名使用"lowerCamelCase"--除了第一个单词外,其他的都以大写字母开头,如"isTrue"。

1.5变量数组

数组是可以存储多个数据项的变量。这些数据按顺序存储在数组的"元素"中,这些元素是有编号的,从0开始。因此,第一个值被存储在元素0中,第二个值被存储在元素1中,以此类推。

数组的声明方式与其他变量相同,但另外还必须在声明中指定数组的大小,在数组名称后面的方括号中。例如,声明名为"nums"的数组来存储六个整数:

int nums[6];

可以选择在声明数组时对其进行初始化,将每个元素的值以逗号分隔的列表形式用大括号括起来。例如:

int nums[6] = { 0, 1, 2, 3, 4, 5 };

单独的元素可以用数组的名称和包含元素编号的方括号来引用。这意味着nums[1]引用的是上面例子中的第二个元素--而不是第一个元素,因为元素编号从0开始。

可以为任何C++数据类型创建数组,但每个元素只能包含相同数据类型的数据。一个字符数组可以用来存储一串文本,如果最后一个元素包含特殊的 \0 null字符。比如说

char name[5] = { 'm', 'i', 'k', 'e', '\0' };

数组中的元素统称为"索引"。数组可以有一个以上的索引--代表多个维度,而不是普通数组的单维。三个索引以上的多维数组并不常见,但二维数组对于存储基于网格的信息(如坐标)很有用。比如说

int coords[2] [3] = { { 1, 2, 3 } , { 4, 5, 6 } };

arrays.cpp

#include <iostream>
using namespace std;

int main()
{
  float nums[3]; // Declared then initialized.
  nums[0] = 1.5; nums[1] = 2.75; nums[2] = 3.25;

  // Declared and initialized.
  char name[5] = { 'm', 'i', 'k', 'e', '\0' };
  int coords[2] [3] = { { 1, 2, 3 } , { 4, 5, 6 } };

  cout << "nums[0]: " << nums[0] << endl;
  cout << "nums[1]: " << nums[1] << endl;
  cout << "nums[2]: " << nums[2] << endl;
  cout << "name[0]: " << name[0] << endl;
  cout << "Text string: " << name << endl;
  cout << "coords[0][2]: " << coords[0][2] << endl;
  cout << "coords[1][2]: " << coords[1][2] << endl;

  return 0;
}

执行:

$ g++ arrays.cpp -o arrays
(base) andrew@andrew-YTF-XXX:~/code/c++easy$ ./arrays
nums[0]: 1.5
nums[1]: 2.75
nums[2]: 3.25
name[0]: m
Text string: mike
coords[0][2]: 3
coords[1][2]: 6

1.6矢量数组

矢量是普通数组的替代品,它的优点是可以根据程序需要改变其大小。创建:vector < data-type > vector-name ( size ) 或vector < data-type > vector-name ( size , initial-value ) 。

vector.cpp

#include <vector>
#include <iostream>
using namespace std ;

int main()
{
  vector <int> vec(3,100) ;

  cout << "Vector size: " << vec.size() << endl ;
  cout << "Is empty?: " << vec.empty() << endl ;
  cout << "First element: " << vec.at(0) << endl ;

  vec.pop_back() ; // Remove final element.
  cout << "Vector size: " << vec.size() << endl ;
  cout << "Final element: " << vec.back() << endl;

  vec.clear() ; // Remove all elements.
  cout << "Vector size: " << vec.size() << endl;

  vec.push_back( 200 ) ; // Add an element.
  cout << "Vector size: " << vec.size() << endl ;
  cout << "First element: " << vec.front() << endl ;

  return 0 ;
}

执行:

$ g++ vector.cpp -o vector
$ ./vector
Vector size: 3
Is empty?: 0
First element: 100
Vector size: 2
Final element: 100
Vector size: 0
Vector size: 1
First element: 200

1.7常量

在程序执行过程中不会改变的数据应该存储在常量容器中。这样可以更好地让编译器检查代码中的错误--如果程序试图改变存储在常量中的值,编译器就会报告错误,编译就会失败。

常量可以为任何数据类型创建,方法是在变量声明前加上const关键字,然后再加上空格。通常情况下,常量名称以大写字母出现,以区别于小写变量名称。与变量不同,常量必须始终在声明中被初始化。例如,数学pi值的常量声明看起来像这样。

const double PI = 3.1415926536;

enum关键字可以用简洁的方式创建整数常量序列:

enum suit { CLUBS , DIAMONDS , HEARTS , SPADES };

除非指定,第一个常量的值为0,下一个常量的值为1,以此类推。一个常量可以被赋予任何整数值,但是列表中的下一个常量总是将其递增为1。

有时将枚举常量列表定义为"自定义数据类型"更方便的--通过使用typedef关键字。这可以作为枚举声明的开始,并且可以在声明的末尾添加一个选定的类型名称。例如,这个typedef语句创建了名为"charge"的自定义数据类型。

typedef enum { NEGATIVE , POSITIVE } charge;

然后可以用通常的方法创建自定义数据类型的变量,这些变量可以合法地分配给所列的任何常量。从本质上讲,这些变量的作用就像int变量一样--因为它们存储的是被分配的常量所代表的数字整数值。例如,在上面的例子中,将一个POSITIVE常数分配给一个电荷变量,实际上分配了一个1的整数。

constant.cpp

#include <iostream>
using namespace std;

int main()
{
    const double PI = 3.1415926536;
    cout << "6\" circle circumference: " << (PI * 6) << endl;

    enum { RED=1, YELLOW, GREEN, BROWN, BLUE, PINK, BLACK };
    cout << "I shot a red worth: " << RED << endl;
    cout << "Then a blue worth: " << BLUE << endl;
    cout << "Total scored: " << (RED + BLUE) << endl;   

    typedef enum { NEGATIVE , POSITIVE } charge;
    charge neutral = NEGATIVE , live = POSITIVE;
    cout << "Neutral wire: " << neutral << endl;
    cout << "Live wire: " << live << endl; 
 
    return 0;
}

执行:

$ g++ constant.cpp -o constant
$ ./constant
6" circle circumference: 18.8496
I shot a red worth: 1
Then a blue worth: 5
Total scored: 6
Neutral wire: 0
Live wire: 1

小结

  • C++是一种面向对象的编程语言,是C语言的扩展。
  • GNU C++编译器可用于Windows和Linux。
  • 预处理器指令用于使程序可以使用标准C++库中的功能。
  • C++程序必须包含main方法作为程序的入口。
  • 语句定义了程序要执行的动作。
  • 建议对程序代码进行注释。
  • c++命令调用编译器,其-o选项允许命令指定生成的可执行文件的名称。
  • 变量声明指定了数据类型和名称,通过这个名称可以引用该变量内的值。
  • cout函数是C++ iostream库的一部分,它将内容写到标准输出控制台。
  • 数组是固定大小的变量,在元素中存储多个数据项,这些元素的编号从0开始。
  • 特殊的\0字符可以分配给char数组的最后一个元素,使其被视为单一的文本字符串。
  • 矢量变量在元素中存储多个数据项,并且可以动态地调整大小。
  • 存储在数组或向量元素中的值可以使用该变量的名称索引号来引用。
  • 永远不会改变的变量值应该存储在常量中。
  • 常量列表可以通过enum关键字自动编号,并通过typedef关键字给出类型名称。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容