Qt教程一(三)
6.需要的C++知识
1.什么是C++
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
2.如何定义一个类
class Animal { public: Animal(const std::string& name,int age) :name(name),age(age) { } void cry() { std::cout<<name<<" "<<age<<" "<<u8"Animal cry"<<std::endl; } private: std::string name; int age; };
3.什么是对象,如何定义?
对象是类的实例化
Animal cat("猫",5); Animal *dog = new Animal("dog",3); delete dog;
4.如何访问类的成员变量
普通变量通过" . “,指针变量通过” -> "
cat.cry(); dog->cry();
5.类的函数成员
一:在类里面声明
二:实现这个函数,我们可以直接在类的里面写,也可以写在类的外面。
class Animal { public: Animal(const std::string& name,int age); void cry(); private: std::string name; int age; }; Animal::Animal(const std::string& name,int age) :name(name),age(age) {} void Animal::cry() { std::cout<<name<<" "<<age<<" "<<u8"Animal cry"<<std::endl; }
6.类函数的重载特性
C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。不能只有函数返回值类型不同。
class Animal { public: ... void cry() { std::cout<<name<<" "<<age<<" "<<u8"Animal cry"<<std::endl; } void cry(int count) { for(int i=0;i<count;i++) { std::cout<<i<<"->"<<name<<" "<<age<<" "<<u8"Animal cry"<<std::endl; } } private: ... };
7.构造函数和析构函数
构造函数:定义对象时会调用构造函数
析构函数:生命周期结束或者释放对象时,会调用析构函数
特点
构造函数和析构函数的函数名和类名一样,能够重载;没有返回类型申明
析构函数在名字前面加~,析构函数不能被重载;没有返回类型申明
匿名对象
深、浅拷贝
移动语义
8.类的继承
类的继承允许我们在新的类里面继承父类的public和protected部分。
class Snake:public Animal { public: using Animal::Animal; Snake(int age) :Animal("snake",age) { } };
9.虚函数和纯虚函数
虚函数:有实际定义的,允许派生类对他进行覆盖式的替换,virtual修饰。
纯虚函数:没有实际定义的虚函数就是纯虚函数,子类必须自己实现。
虚函数的优点是可以预留接口(API)。
10.lambda表达式
Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。
基本语法:
[capture list] (parameter list)mutable/noexcept -> return type { function body } /* capture list 参数捕获列表 parameter list 形参列表(可省略) mutable/noexcept 选项 (可省略) ·mutable 可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身) ·noexcept 表示函数不抛异常 -> return type 尾置返回类型(可省略) function body 函数体 */
capture list 参数捕获列表
[] 不捕捉任何变量
[&] 捕获外部作用域中所有变量, 并作为引用在函数体内使用 (按引用捕获)
[=] 捕获外部作用域中所有变量, 并作为副本在函数体内使用 (按值捕获)
拷贝的副本在匿名函数体内部是只读的
[=, &foo] 按值捕获外部作用域中所有变量, 并按照引用捕获外部变量 foo
[bar] 按值捕获 bar 变量, 同时不捕获其他变量
[&bar] 按值捕获 bar 变量, 同时不捕获其他变量
[this] 捕获当前类中的this指针
让lambda表达式拥有和当前类成员函数同样的访问权限
如果已经使用了 & 或者 =, 默认添加此选项
parameter list 形参列表(可省略)
mutable/noexcept 选项 (可省略)
mutable 可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)
noexcept 表示函数不抛异常
-> return type 尾置返回类型(可省略)
function body 函数体