您现在的位置是:首页 >技术教程 >C++必背基础知识点总结网站首页技术教程
C++必背基础知识点总结
重点:不借助任何外部资料就能掌握,考试面试大概率涉及。
掌握:不借助任何外部资料就能掌握,考试面试有可能涉及。
熟悉:可以适当参考资料掌握,考试面试有可能涉及。
了解:可是参考资料掌握,考试几乎不考,面试如果涉及简单聊聊即可。
一、C++简介
1. 为什么要学习C++?
理由一
C++是面向对象编程最有代表性的语言之一,可以通过C++课程学习新的编程思想。
理由二
之前编程都是没有界面的,Qt是嵌入式中常用的图形用户界面编程框架,而Qt是基于C++的。
理由三
C++与Qt方向与之前的课程关联度相对较低,并且可以单独形成就业方向。
2. C++课程的定位
C++课程偏向于理论,要求学习语法,不要想为什么。Qt是C++的实践课,你的为什么都会得到解答。
3. C++的发展(了解)
1983年,贝尔实验室(Bell Labs)的Bjarne Stroustrup发明了C++。 C++在C语言的基础上进行了扩充和完善,是一种面向对象程序设计(OOP)语言。
Stroustrup说:“这个名字象征着源自于C语言变化的自然演进”。还处于发展完善阶段时被称为“new C”,之后被称为“C with Class”。C++被视为C语言的上层结构,1983年Rick Mascitti建议使用C++这个名字,就是源于C语言中的“++”操作符(变量自增)。而且在共同的命名约定中,使用“+”以表示增强的程序。
常用于系统开发,引擎开发、嵌入式开发等应用领域, 至今仍然是最受广大程序员喜爱的编程语言之一。
4. C++的特点(熟悉)
•在支持C的基础上,全面支持面向对象编程
•编程领域广泛,功能强大(最强大的编程语言,没有之一)
•标准保持更新,目前常用的基础标准为ISO C++98标准、ISO C++11标准等
•为数不多的支持底层操作的面向对象语言
•在面向对象的语言中执行效率极高
5. 面向对象编程的概念(掌握)
面向对象的思想是需要在学习的过程中逐步参透的,面向对象有三大核心的特点:
封装 → 继承 → 多态
面向对象还有两个最基础的概念:
类、对象
【例子】如果要把大象装进冰箱,应该怎么办?
面向过程的编程思想:
1. (我)把冰箱门打开
2. (我)把大象装进去
3. (我)把冰箱门关上
面向对象的编程思想:
1. (我)把大象和冰箱叫过来
2. (我)给大象和冰箱下达任务
3. 大象和冰箱自行组装
面向过程的语言,它关注的重点是“算法”,可以认为“算法”是一系列有序的步骤,只要按照步骤去做,就可以的得到预计的结果。所以面向过程的编程编写的程序通常是一系列有序的语句,这种方式更符合计算机执行命令的本质。特点是开发效率低,运行效率高。
面向对象的语言,它关注的重点是“管理”,程序员需要在程序中管理各种对象,对象可以认为是一系列由于某种联系而聚焦在一起数据。可以认为,面向对象的语言,程序员关注的是管理数据之间的关系,这种方式更接近于人类社会的思考方式。特点是开发效率高,运行效率低。
C++兼容面向过程与面向对象,但是以面向对象为主。
6. 环境安装
C++编程可以使用很多集成开发环境(IDE),本次课程没有固定要求,但是考虑到后面的Qt课程,所以推荐直接使用Qt的集成开发环境:Qt Creator
本次教学使用的版本是5.2.1,不是最新版本。
此版本环境安装步骤非常简单,一直下一步即可,但是需要注意,任何路径和文件名不得包含中文字符。
为了使Qt Creator支持C++的中文输出,安装完成后先修改文件编码,如下所示。
修改完成后,为了稳妥起见,建议关闭Qt Creator后,重新打开。
7. 第一个C++程序
创建并运行一个C++项目的操作步骤如下所示。
1. 启动Qt Creator后,点击
2. 在弹出的窗口中,按照下图所示进行操作。
3. 在弹出的窗口中输入项目名称并设置工作目录的路径后,点击“下一步”。
4. 在弹出的窗口中直接点击“下一步”。
5. 在项目管理界面,直接点击完成。
6. 可以看到项目创建完成,自带一个C++源代码文件,点击可以运行项目。
main.cpp
// 标准输入输出流头文件,C++自带的头文件使用尖括号,不写.h
#include <iostream>
// 使用std名字空间(后面会讲,不要删)
using namespace std;
/**
* @brief main 主函数,程序的入口
*/
int main()
{
// 输出一个字符串后,再输出一个换行(endl)
cout << "Hello World!" << endl;
cout << "你好世界!" << endl;
return 0;
}
除了main.cp以外,还有一个.pro文件,此文件用于配置项目的参数,本次课程此文件的功能主要用于使项目完全支持C++11特性,只需要在文件中添加下面一段话。
QMAKE_CXXFLAGS += -std=c++11
二、从C到C++
除了面向对象的内容,C++也有一些与C语言不同的地方,本章主要讲解一些与面向对象无关的差异。
1. 引用 reference(重点)
1.1 概念
引用是对某个变量的“别名”,对引用进行操作与对变量本身进行操作完全一样。
#include
using namespace std;
int main()
{
int a = 1;
// 创建一个变量a的引用
int& b = a; // 创建一个a的引用b(b引用a)
// a和b的操作完全相同
b++;
a++;
cout << a << " " << &a << endl; // 3 0x61fe88
cout << b << " " << &b << endl; // 3 0x61fe88
return 0;
}
1.2 性质
(1)可以改变引用的变量的值,但是不能再次成为其他变量的引用。
#include
using namespace std;
int main()
{
int a = 1;
int b = 2;
int& c = a; // c是a的引用
c = b; // 把b的值赋给c
cout << a << " " << &a << endl; // 2 0x61fe88
cout << b << " " << &b << endl; // 2 0x61fe84
cout << c << " " << &c << endl; // 2 0x61fe88
// int& c = b; 错误
// &c = b; 错误
return 0;
}
(2)声明引用时,必须初始化。
#include
using namespace std;
int main()
{
int a = 1;
// int& b; 错误
b = a;
return 0;
}
(3)声明引用时初始化的值不能为NULL。
#include
using namespace std;
int main()
{
// int& a = NULL; 错误
return 0;
}
(4)声明引用的初始值如果是纯数值,需要使用const关键字修饰引用,表示引用的值不可变(常引用,常量引用)。
#include
using namespace std;
int main()
{
// 常引用
const int &a = 123;
// a++; 错误
cout << a << endl; // 123
return 0;
}
(5)可以将变量引用的地址赋值给一个指针(指针指向引用),此时指针指向的还是原来的变量。
#include
using namespace std;
int main()
{
int a = 1;
int &b = a;
int* c = &b; // 指针c指向b
a++;
cout << *c << endl; // 2
return 0;
}
(6)可以对指针建立引用
#include
using namespace std;
int main()
{
int a = 1;
int* b = &a; // b是a的指针
int*& c = b; // c是b的引用
cout << &a << " " << a << endl; // 0x61fe88 1
cout << b << " " << *b << endl; // 0x61fe88 1
cout << c << " " << *c << endl; // 0x61fe88 1
return 0;
}
(7)可以使用const关键字修饰引用,此时不能通过引用修改数值,但是可以修改引用的原变量数值。
#include
using namespace std;
int main()
{
int a = 1;
const int &b = a; // b是a的常引用
// b++; 错误
a++;
cout << b << endl; // 2
return 0;
}
1.3 引用参数
可以使一个函数的参数定义为引用类型,这样可以提升参数传递的效率,因为引用与指针一样,会产生副本。
引用参数应该在能被定义为const的情况下,尽量定义为const,以达到引用的安全性。
#include
using namespace std;
void show(const int& a,const int& b)
{
cout << a << b << endl;
}
int main()
{
int a = 1;
int b = 2;
show(a,b); // 12
return 0;
}
【例子】写一个函数,输入两个整型参数,要求函数可以交换两个输入参数的值。
可以使用异或运算交换两个数值,原理是对同一个数使用同一个数连续进行两次异或可以恢复原数值。
#include
using namespace std;
/**
* @brief swap1 错误,交换的是swap1局部的变量
*/
void swap1(int a,int b)
{
// 异或交换
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
/**
* @brief swap2 正确,但复杂
*/
void swap2(int* a,int* b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
/**
* @brief swap3 正确且简单
*/
void swap3(int& a,int& b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
int main()
{
int a = 1;
int b = 2;
swap1(a,b);
cout << a << endl; // 1
cout << b << endl; // 2
swap2(&a,&b);
cout << a << endl; // 2
cout << b << endl; // 1
swap3(a,b);
cout << a << endl; // 1
cout << b << endl; // 2
return 0;
}
2. 赋值(熟悉)
为了与后面对象的操作方式一致,C++中给普通变量也增加了新的赋值方式。
#include
using namespace std;
int main()
{
int a = 1;
// C++支持以下写法
int b(2); // 相当于 int b = 2;
cout << a << " " << b << endl; // 1 2
int c(a); // 相当于 int c = a
cout << c << endl; // 1
b = 4;
cout << b << endl; // 4
// b(5); 错误
return 0;
}
C++11中新增数据窄化的功能支持。
#include
using namespace std;
int main()
{
double a = 3.14;
int b = a;
int c(a);
cout << b << " " << c << endl; // 3 3
// C++11窄化警告
int d{a};
cout << d << endl; // 3
return 0;
}
3. 输入(熟悉)
C++中使用cin录入键盘输入,cin与cout一样,也支持连续输入。
#include
using namespace std;
int main()
{
cout << "请输入两个数字:" << endl;
int a;
int b;
cin >> a >> b; // 连续输入
cout << "您输入的数字是:" << a << " " << b << endl;
// C++中使用string类型作为字符串类型
string c;
cout << "请输入一个字符串:" << endl;
cin >> c;
cout << "您输入的字符串是:" << c << endl;
return 0;
}
4. 字符串类型 string(掌握)
4.1 基础使用
string类型不是C++的基本类型,string是C++标准库中的一个类,使用的时候需要引入头文件#include ,而不是#include 。
string类型在绝大多数情况下可以代替char*,不必担心内存、长度等问题,同时string类内部包含了很多内置函数,可以完成特定的操作。
#include
using namespace std;
int main()
{
string s = "你好";
// 不支持中文(使用的ASCII编码)
cout << "s的长度:" << s.size() << endl;
cout << "s[0]=" << s[0] << endl;
s = "Hello";
cout << "s的长度:" << s.size() << endl;
cout << "s[0]=" << s[0] << endl;
return 0;
}
4.2 遍历
string支持三种遍历:下标循环、for-each、迭代器(后面专属篇章讲解)
#include
using namespace std;
int main()
{
string s = "hello bye!";
cout << "-----------下标遍历----------" << endl;
for(int i = 0;i<s.length();i++) //length函数与size函数完全一样
{
cout << s[i] << endl;
}
cout << "-----------C++ 11 for each--------------" << endl;
for(char i:s) // 脱离下标
{
cout << i << endl;
}
// 迭代器:略
return 0;
}
4.3 at函数
可以使用at函数取出单个字符,与[]相比,更推荐使用at函数,原因是at函数更加安全。
#include
using namespace std;
int main()
{
string s = "hello bye!";
// 取出第三个字符
cout << s[2] << endl; // l
cout << s.at(2) << endl; // l
// 尝试取出第100个字符
// cout << s[99] << endl; // '