C++极简教程(开发环境设置和类的实现)-环境配置和Hello World

最近在coursera上学了一个C++课程,感觉简直是世界上最简单的C++入门课程了,对于有一定其他语言编程基础的人来说,整个课程非常清晰和流畅。

非常推荐这门课程,感谢伊利诺伊大学香槟分校的Wade Fagen-Ulmschneider的这门课,让我觉得C++也不过是门编程语言,没必要从入门到放弃,一周的时间绝对可以简单入门,可以写出正确的代码,编写自己的类,完成自己的一个小程序。

课程地址如下:https://www.coursera.org/learn/cs-fundamentals-1#syllabus

这是一个系列课程,C++教学课程是其中的第一个课程:Object-Oriented Data Structures in C++(C++,面向对象的数据结构)。

由于课程是纯英文的,可能不太友好,这里翻译和记录一下学习的历程,希望对大家学习C++有所帮助。


课程一共四周,每周大概平均50-60min的视频和40min的阅读材料。视频内容都非常简单,抽出一个礼拜,仔细认真看视频,不懂的地方暂停,弄懂了再继续,效果会非常好。

Week1: Orientation; Writing a C++ Program 方向;编写一个C++程序

This course teaches learners how to write a program in the C++ language, including how to set up a development environment for writing and debugging C++ code and how to implement data structures as C++ classes. 

这节课程的目的是教会大家如何用C++语言编写程序,包括如何如何设置开发环境来写代码和调试代码,以及如何实现一个C++中的类(class)数据结构【就理解成怎么写一个“类”吧】。

week1的课程虽然很重要,因为是开发的基础,但是课程里面用到的操作系统环境是Linux的,如果大家习惯用Windows,也不用费力一定要安装一个Linux环境,直接安装一个Visual Studio就好了,毕竟操作系统和IDE只是工具,不是目的。始终记得,我们的目的是学会C++。

操作环境和IDE的选择有以下几种(对于国内的小盆友来说更好的选择):

操作系统:

  1. win10中安装虚拟机,虚拟机上安装ubuntu 2020;
  2. 一台安装了win10的电脑上装一个ubuntu 2020,也就是双系统;
  3. 纯win10系统.

IDE:

  1. ubuntu下的调试会用到git、g++等一系列的工具,本文不详细介绍,感兴趣的同学可以自行观看Wade教授的视频教程;相信能在linux下进行程序开发的人也不需要我详细介绍了。
  2. win10下面用vs2015 professional, VS 2017 community虽然是完全免费的,但是我装完有问题,折腾了很久也没弄好,最后还是装回15版本的,网上也有很多15的破解方法,自己搜一搜。安装的时候注意一定不要默认安装,选择自定义,把C++相关的内容安装好。默认安装只安装C#。

选择一种你习惯的IDE,你习惯的操作系统,知道如何进行程序的调试就可以愉快地学习C++了。当然配置调试环境的过程可能比较麻烦,有点儿耐心,多百度,多问问旁人,一定可以顺利安装好的。


Let’s begin!

假设你已经安装好了VS 2015,并顺利激活,那么,我们就可以开始用一个小例子来验证一下我们的调试环境是不是OK的。

1. 打开VS2015,从“文件”-->“新建”-->“项目”,选择“Visual C++”-->“空项目”,选择合适的路径,最好路径中不要出现任何中文,点击“确定”,新建一个C++空项目。

2. 按下确认之后,VS就帮你新建好了一个空项目,长这样。因为这是一个空项目,所以里面什么都没有,只有几个文件夹。我们现在需要知道的就是头文件和源文件这两个文件夹。我们在源文件上右键单击,选择“添加”-->“新建项”,新建一个名为main.cpp的文件。

3. 现在我们的项目里面已经有了一个文件了,叫main.cpp,虽然这个文件里什么都没有。下面,我们就在main.cpp里添加一些代码,来实现我们的第一个C++程序。

4. 在main.cpp中输入以下代码:

#include <iostream>    
//包含系统的标准输入输出控制头文件

int main() {
	std::cout << "Hello World!" << std::endl;    //在控制台中显示 Hello World!
	getchar();    //等待一个键盘输入命令,目的是让控制台不要一闪而过
}

5. 如果我们点击“调试”-->"开始调试",应该会弹出一个黑框框,上面显示着:Hello World!至此,我们的第一个C++程序就完成了。

我们再给刚刚的小例子加一点东西:

#include <iostream>
int main() {
	std::cout << "Hello World!" << std::endl;

	std::string str =  "I'm Very " ;

	int a = 2;
	std::cout <<str.c_str() << a << std::endl;

	getchar();
}

这个程序的运行结果你可以自己试一试。

Summary

好的,我们从这个非常非常简单的小例子中学到了什么呢?

1. C++只有两种变量类型:

  • 原始(初始?)类型 primitive type:比如int、bool、float、double、char等等
  • 用户自定义类型 user-defined type:比如std::string, std::vector等

变量的初始化语句通常由四部分组成:变量类型,变量名,赋值操作符,值。


//类型        变量名     赋值操作符     值
int            a           =           10;
std::string    str         =           "I'm so pretty.";

 

2. 程序的入口(程序是从哪里开始执行的):

任何的C++程序的入口都是main()函数,这个函数在整个项目里有且只能有1个,和cpp文件的名字没有任何关系,就算上面这个程序中的main.cpp改成了其他名字,也一样会从main()函数处开始执行。比如,我把main.cpp重命名为了test.cpp,这个程序仍然可以成功运行,并得到和上面一样的结果。

3. 程序里常见的两种文件

C++程序往往包含很多文件,最常见的有:

  • 源文件:.cpp文件
  • 头文件:.h文件

先来了解一下这两个文件是做什么,头文件中包含一系列的变量和函数的声明,源文件中是对这些函数的功能的实现,比如我在头文件中声明了我有一个sum函数,这个函数的功能是把两个整数加起来,那么我就要在源文件中去实现这个函数的功能;你可以这么理解:头文件是和别人打交道的,告诉别人我都能干什么,但是不告诉他我是如何做到的,如何做到的这部分放在源文件里。

通常函数的实现会用到非常多的代码,你不应该把这么多的代码都放在头文件中。

因为当程序运行的时候如果遇到#include这个命令,他就会把跟在#include后面的这个头文件中的所有代码复制到源文件中。所以头文件尽量简洁,只告诉别人我能做什么就行了,不需要告诉他你是怎么做的。当你真正用到某个函数的时候,程序自然会顺着头文件去找和同名的源文件,然后就能找到你需要的这个函数。

4. 为什么要用头文件?

我们在开发程序的时候往往需要用到很多的函数,比如cout,在屏幕上输出字符串;比如sqrt,计算开方;总不能所有的这些功能都去自己敲代码实现吧?

其实已经有别人帮我们写好了这些函数,我们只需要#include他们写好的头文件就可以使用这些函数了。

在这个项目中,我们使用了一个系统自带的头文件,也就是iostream.h这个文件,但是这里他没有显示.h这个扩展名。

在VS环境中包含头文件的方式有两种:

#include <iostream>    //尖括号包含系统自带的标准头文件
#include "myfile.h"    //双引号包含自定义的头文件

iostream中的代码大概长下面这个样子,头文件中的第一句话通常都是#pragma once,这句话的意思是只编译一次。为啥要写这句呢,因为整个程序中可能会有其他的源文件包含了相同的一个头文件,如果每次我都去编译一下,很浪费时间,所以只在第一次碰到这个头文件的时候编译它一次。

// iostream standard header for Microsoft
#pragma once
...

__PURE_APPDOMAIN_GLOBAL extern istream cin, *_Ptr_cin;
__PURE_APPDOMAIN_GLOBAL extern ostream cout, *_Ptr_cout;
__PURE_APPDOMAIN_GLOBAL extern ostream cerr, *_Ptr_cerr;
__PURE_APPDOMAIN_GLOBAL extern ostream clog, *_Ptr_clog;

__PURE_APPDOMAIN_GLOBAL extern wistream wcin, *_Ptr_wcin;
__PURE_APPDOMAIN_GLOBAL extern wostream wcout, *_Ptr_wcout;
__PURE_APPDOMAIN_GLOBAL extern wostream wcerr, *_Ptr_wcerr;
__PURE_APPDOMAIN_GLOBAL extern wostream wclog, *_Ptr_wclog;
...

5. 命名空间namespace

iostream中的命名空间是std,所以使用它的函数的时候用“::”符号就表示使用的函数是std命名空间中的。

命名空间的意义是为了区分相同名字的函数,比如我自己好死不死的写了一个cout函数,但其实它的功能是加和(我没病...),那么当程序调用cout函数的时候,它就不知道它调用的是我的cout还是iostream定义的cout函数了。

看看下面这个例子:

#include <iostream>

/*my cout :
add a and b*/
int cout(int a, int b) {
	return (a + b);
}

int main() {
	int a = 2, b = 3;
	std::cout << "a+b=" << cout(a, b) << std::endl;
	getchar();
}

这个程序是可以成功运行的,程序运行结果是:a+b=5. 但是如果你把std::删去,就不行了,会提示出现错误。因为没有命名空间,程序默认使用的是我在main.cpp中定义的这个cout函数,而不是用于输出字符串的std::cout程序。

为了避免发生此类错误,可以把自定义的类、函数都写在一个命名空间中,比如myfunc,调用的时候用myfunc::cout,就可以明确告诉程序,你需要去调用myfunc中的cout函数。程序运行结果是:a+b=5.

#include <iostream>

/*my cout :
add a and b*/
namespace myfunc{
	int cout(int a, int b) {
		return (a + b);
	}
}

int main() {
	int a = 2, b = 3;
	std::cout << "a+b=" << myfunc::cout(a, b) << std::endl;
	getchar();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值