类的构造函数
类的构造函数和类的名称完全相同,没有任何返回值,可以为某些成员变量设置初始值
#include <iostream>
using namespace std;
class Line
{
public:
void setLength( double len );
double getLength( void );
Line(); // 这是构造函数
private:
double length;
};
// 成员函数定义,包括构造函数
Line::Line(void)
{
cout << "Object is being created" << endl;
}
void Line::setLength( double len )
{
length = len;
}
double Line::getLength( void )
{
return length;
}
// 程序的主函数
int main( )
{
Line line;
// 设置长度
line.setLength(6.0);
cout << "Length of line : " << line.getLength() <<endl;
return 0;
}
-
可以带参数,需要在创建对象时给对象赋初始值
-
可以使用初始化列表
Line::Line( double len): length(len) { cout << "Object is being created, length = " << len << endl; } C::C( double a, double b, double c): X(a), Y(b), Z(c) { .... }
类的析构函数
析构函数和类的名称完全相同,前面加~作为前缀,没有任何返回值,也不能带参数。有助于在跳出程序之前释放资源
#include <iostream>
using namespace std;
class Line
{
public:
void setLength( double len );
double getLength( void );
Line(); // 这是构造函数声明
~Line(); // 这是析构函数声明
private:
double length;
};
// 成员函数定义,包括构造函数
Line::Line(void)
{
cout << "Object is being created" << endl;
}
Line::~Line(void)
{
cout << "Object is being deleted" << endl;
}
void Line::setLength( double len )
{
length = len;
}
double Line::getLength( void )
{
return length;
}
// 程序的主函数
int main( )
{
Line line;
// 设置长度
line.setLength(6.0);
cout << "Length of line : " << line.getLength() <<endl;
return 0;
}
C++ struct
和C不同,C++在定义结构体时省略关键词struct
C++不提倡使用外部变量,但提倡使用外部结构声明
可以使用列表初始化
struct和class的区别
在C中,因为struct是一种数据类型,那么就肯定不能定义函数,所以在面向c的过程中,struct不能包含任何函数。否则编译器会报错。面向过程的编程认为,数据和数据操作是分开的。然而当struct进入面向对象的c++时,其特性也有了新发展,就拿上面的错误函数来说,在c++中就能运行,因为在c++中认为数据和数据对象是一个整体,不应该分开,这就是struct在c和c++两个时代的差别。
在C++中struct得到了很大的扩充:
1.struct可以包括成员函数
2.struct可以实现继承
3.struct可以实现多态
二.strcut和class的区别
1.默认的继承访问权。class默认的是private,strcut默认的是public。
2.默认访问权限:struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的。
3.“class”这个关键字还用于定义模板参数,就像“typename”。但关建字“struct”不用于定义模板参数
4.class和struct在使用大括号{ }上的区别
关于使用大括号初始化
1.)class和struct如果定义了构造函数的话,都不能用大括号进行初始化
2.)如果没有定义构造函数,struct可以用大括号初始化。
3.)如果没有定义构造函数,且所有成员变量全是public的话,class可以用大括号初始化
基类&派生类
class derived-class: access-specifier base-class
base-class:之前定义的某个类的名称
access-specifier:是public/protected/private其中的一个,base-class是之前定义过的某个类的名称,若不使用,默认是private
访问控制和继承
派生类继承了所有基类方法,除去:
- 基类的构造函数、析构函数和拷贝构造函数
- 基类的重载运算符
- 基类的友元函数
继承类型
几乎不使用protected和private继承
公有继承:基类的公有成员是派生类的公有成员,基类的保护成员是派生类的保护成员,基类的私有成员不能直接被派生类访问。
多继承
一个子类可以有多个父类,继承多个父类的特性。C++类可以从多个类继承成员
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,...
{
};
Virtual Function & Override
virtual function在基类中被声明,在继承类中被override
Override关键字帮助防止在覆盖虚函数时出现一些问题
http://c.biancheng.net/view/1561.html
在函数头添加override关键字
class Base
{
public:
virtual void functionA(int arg) const { cout << "This is Base::functionA" << endl;}
};
class Derived : public Base
{
public:
virtual void functionA(int arg) const override{ cout << "This is Derived::functionA" << endl; }
};
Virtual Function vs Pure Virtual Function
Virtual Function的介绍如上,virtual function makes it a polymorphic(多形的) base class. Derived classes can override virtual functions and will be resolved at run-time.
Pure virtual function e.g.
virtual bool f() const = 0;
That makes the class it defined for abstract and can not be instantiated. Derived class need to override or implement all inherited pure virtual functions.
函数重载
函数重载的关键是函数的参数列表,也就是函数的特征标。如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,那他们的特征标是一致的,而变量名无关紧要。
编译器在检查函数特征标时,将类型引用和类型本身视为同一个特征标。
匹配函数时,不区分const和非const变量