面向对象与C++基础—引言

1. 简介:

  之前就说过,未来会写一个C++教程,主要是我了解了一圈语言(包括python、C、C++、Java、C#)、之后最后还是更加喜欢C++,所以就像C一样,我也想写一个C++的基本教程来巩固一下自己所掌握的知识,不过因为知识水平有限,可能C++教程中会有不少疏漏,还请谅解。
  不过这可是C++呀,按我的水平可能只能覆盖到比较少的一部分,所以这次的教程更多知识入门,更多的知识就需要参考更多的书籍和资料来学习了。
  对了,这次的教程会更加专注于Modern C++,我们可能会提到C++14、17甚至是20标准中的C++特性,当然,这些新标准中引入的特性可能已经让C++和C语言大不相同,为了避免出现明显的割裂感,我可能会避开一些和C语言相差过大的新语法。
  大家在编译运行的时候可能要注意增加-std=c++20之类的编译指令,以免出现一些问题。一些特性我应该会在标题中标识出来,当然,怎么说也应该用上C++11标准了对吧?毕竟连我们学校教的都已经是C++11了。
  事实上,C++是C语言的一个超集,也就是说,C++从设计之初就是以包含C语言的方式设计的,因此几乎所有的C语言语法在C++中都是合法的,按理说你现在写过的很多代码直接搬移到一个.cpp文件中编译运行,也都是可以正常运行的。
  这的确是好事,兼容性不错,如果有了C语言的基础,那么理解C++的基础也会很简单,因为基本语法的变化不是很大,但我不希望大家写的C++代码仅仅只是C with classes and cout,只是简单的把printf之类函数换成了cout,并且加上面向对象的设计模式,你想这么写当然也没问题,但是以学习新语言的方式学C++,你会有更多的收获。
最后再提示一下,这一篇教程需要你已经具备了C语言的基础,如果你已经读完了我的《一个C语言的基本教程》的话,应该就没有障碍了。

2. 准备工作

 学习C++语言你同样也需要准备一个合适的IDE,Code::Blocks,Dev-C++ 依旧可以写C++,未来你也还是可以选择像是 Microsoft Visual Studio(2017~2022),JetBrains CLion(最新版本) 这样的面向工程的高阶IDE,或者说你也可以选择 Sublime Text,Visual Studio Code,Vim甚至是Windows自带的记事本 等等编辑器完全代码的书写,然后使用g++或clang++编译器自行编译.
  还有一个问题就是,你选择的IDE中附带的,或者自己安装的编译器版本不能过低,因为这次的教程中会有很多新标准的内容,如果编译器连C++11都支持不完全,那你写出来的代码可能跟我会有很大很大的区别,这样的体验肯定是不太好的,对吧?

3. 再说说C++标准

  在学习C语言的过程中其实我们不是很会在意标准,因为大家基本都是用的C99,而比较新的C11标准相比C99也没有发生很大的变化。
  但是C++就不一样了,C++标准化委员会在每次标准更新都有可能引入很多很新的特征,整个语言从C++98到C++23发生了翻天覆地的变化,C++98可能用起来还像是C with Classes,但是C++11引入的特性非常多,从这之后的标准都被称为Modern C++。
  例如C++11中引入了新的auto关键字,在C以及C++11以前,auto关键字是作为一种指定变量存放位置的关键字,与之对应的是register关键字,是希望将变量存放在寄存器中,不加这个关键字的所有变量都是默认为auto的,不过后来这个关键字的用处已经比较少了,C++11将auto关键字变为了自动推断元素类型,例如:

auto x = 1;

  这时的x就会被自动推断为int类型,不过auto关键字只能用于变量的定义,即auto只会在定义的时候推断一次类型,x的类型不会在程序后续进行中改变类型。这么听起来好像还是没有那么自由,就像python一样,一个变量名的类型可以随便切换,但是auto关键字的出现还是有意义的,在C++中有一系列全新并且名字很长的类型,如std::vector<int>::iterator,这么长一串的名字我平时用的时候肯定是不想打的,虽然在IDE中可能有代码自动补全的功能,但是总有些地方没有自动补全,那这时候用auto就很方便了,比如:

#include <iostream>
#include <vector>
int main()
{
    std::vector<int> v{1, 2, 3};
    auto it{ v.begin() };
    std::cout << typeid(it).name() << std::endl;
    return 0;
}

p1

  在Visual Studio中跑出了这样的结果,很夸张啊,用了auto可以避免了类型名过长的问题。不过这也算是结构与功能相适应吧,在C语言里也不存在这么长的变量名,所以不用自动推断也是正常的。

  在C++中,因为引入了泛型的编程范式,变量的类型就变得更加不确定了,首先我们来看一段代码:

#include <iostream>

template<typename T>
T add(T a, T b)
{
    return a + b;
}

  我们定义了一个add函数,但是它的变量类型很奇怪,只有一个T,而且a、b以及返回类型都是类型T,这是什么意思呢?事实上这叫做模板,是C++的泛型实现方式,在引入模板后,编译器会根据使用情况自动生成对应类型的代码,这就实现了复用,这个add函数对于int、double、float等等基本数据类型全部都是通用的,而且如果a和b是同一数据类型是不会进行隐式类型转换的

  C++可以说是一个大杂烩语言,就编程范式上支持函数式编程、面向对象以及泛型等等,同时还要兼容C语言,最后结果就是C++真的非常非常庞大,庞大到我们都难以想象的地步,你想到的它基本都支持,这也产生了一个问题,这么多的东西我们是不是都要掌握呢?

  我认为不是,事实上学习了语言之后更多的应该考虑如何应用它解决问题,我永远相信亲手写一遍代码比看一遍书来的更有效,在学习C++的过程中我们可以更加倾向于利用C++去做点什么,如果有不明白的,再去找各种资料理解。

  这一段说的有够长,我还是不说那么多了哈哈哈哈哈哈,让我们开始吧!

4. 来看看一段代码

#include <iostream>
int main()
{
    std::cout << "Hello, world!" << std::endl;
    return 0;
}

这就是C++版本的Hello, world!

5. 我们来解析一下吧

#include <iostream>
  • #include 是C++编译预处理的关键字,这和C语言完全一致
  • C++标准库中的头文件与C语言最大的区别在于,C++的头文件默认没有后缀名,例如filesystem(C++17),iostream,ranges(C++20)等等
  • 以前存在于C语言中的头文件在C++中仍然可用,但是要去掉末尾的后缀名并在开头增加一个c,例如cstdio(stdio.h),cmath(math.h),cstdlib(stdlib.h)
int main() 
  • int main()就没啥好说的了
std::cout << "Hello, world!" << std::endl;
  • 这里就很奇妙了,首先是std,std是一个命名空间(namespace),C++中引入了命名空间的概念,它解决了这样一个问题:在C语言,一对花括号构成了一个局部作用域,但是我只能在局部作用域内使用其中的变量,命名空间的出现使得我们可以在此外利用其中的变量(C++中函数也可以放入名字空间中),例如:
#include <iostream>
namespace N
{
    int func(int a, int b)
    {
        return a + b;
    }
}
namespace M
{
    int func(int a, int b)
    {
        return a * b;
    }
}
int main()
{
    int a = 3, b = 4;
    std::cout << N::func(a, b) << " " << M::func(a, b) << std::endl;
    return 0;
}

p2

  这里提的有点多了哈哈哈哈,之后我还会再讲到的。

  • 之后就是::,两个冒号看着有点奇怪,这叫做域解析操作符,一个命名空间就是一个域,从中取出什么的操作就是域解析,所以域解析操作符后面加函数或是变量都是可以的。域解析操作符在类中还会用到,这个我们之后再说。
  • 说实话,cout和<<,有点奇怪,<<是个左移运算符,把cout左移"Hello, world!",听起来就很奇怪。首先cout是一个std::ostream对象,你可以暂时理解为是C++中的一个stdout,C++中引入了运算符重载的操作,std::ostream类重载了这个左移运算符,从而cout就可以通过左移运算符将数据转移输出流中,然后就打印出来了。这个我们之后再来学习。
  • std::endl可以简单理解成一个’\n’,当然,endl还有刷新缓冲区的作用,这个就不多说了。
return 0;
  • main函数依旧是返回int类型的,所以还是要加上这一句,不过return的值已经不是判断程序是否正常运行的唯一标准了,C++中引入了异常机制,我们可以用throw抛出异常的方式表示程序运行异常了。

这回我就不能说C++简单了hhhhh,一个Hello,world!的程序都有这么多讲究,不过没关系,慢慢来,让我们开始吧!

小结

  按理说这章不应该有小结,但我还是写一下,下一章是基础篇,会介绍一下C++中的基本语法,如果与C相同的就不会再提了,基础篇主要是讲一讲C++中的语法变化。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值