抽象数据类型
关键字为struct ,class均可定义一个类,类也就是一种自己定义的数据类型,这个数据类型会包含很多其他的数据类型,如c++primer是一个类,其中的各章节也就是其类中的成员,其成员有他自己的属性,最后形成了封装的c++primer,使用class和struct定义类的唯一区别就是默认的访问权限,这里先介绍访问权限。
1、访问权限
访问权限一共三种:
class Person
{
public:
//公共权限的成员
string name;
protected:
//保护权限
string car;
private:
//私有权限
string password;
};
public: 公共访问权限,在此权限下的类成员,在类的内外均可以进行访问;
protected: 保护访问权限,在此权限下的类成员,在类内可以访问,但是在类外不可以访问;
但是在后续介绍继承的时候,子类就可以继承;
private: 私有访问权限,在此权限下的类成员,在类内可以访问,但是在类外不可以访问;
后续继承中,子类也不可以访问。
在这里说明,继承就好比儿子继承父亲的东西,有一些只有儿子可以继承,但是父亲也有儿子不知道的东西。
class默认访问类型是private,而struct默认访问类型是public;
2、构造类
2.1用struct构造类
struct 类名
{
int i; //变量
const int j; //常量
int* p; //指针
vector<int>v; //容器等
};
可以是系统的类型,可以是自己构造的类。
2.2用class构造类
由于class默认的成员访问权限是private故使用class要加上权限说明。
class lname
{
public:
int i;
protected:
const int j;
int* p;
private:
vector<int>v;
};
3.类的对象的初始化与清理
一般来说类的对象的初始化均是利用构造函数来初始化利用析构函数来清理,下面这段代码就是构造函数与析构函数的大体组成;
class MyClass
{
public:
MyClass() //这是类的构造函数的形式
{
statement;
}
~MyClass() //这是类的析构函数的形式
{
statement;
}
};
3.1构造函数
1)构造函数用来进行对类的初始化函数名与类名相同;
2)没有返回值,不用写void;
3)可以有参数,可以发生重载;
4)构造对象时,构造函数自动调用而且只调用一次;
3.2析构函数
1)析构函数用来清理的作用;
2)没有返回值,不用写void;
3) 不可以有参数,不能发生重载
4)在对象销毁前自动调用析构函数,且只调用一次。
总结:如果构造类时没有写构造函数和析构函数,编译器会自动构造一个空的构造函数和析构函数,构造函数是用来对类初始化的,析构函数是用来在对象销毁前对其所占的空间进行释放的。
3.3构造函数的分类
构造函数按参数分可分为有参构造和无参构造(默认构造);
构造函数按类型分可分为普通构造和拷贝构造;
class MyClass
{
public:
MyClass() 无参构造函数
{
statement;
}
MyClass(参数类型 参数....) 有参构造函数
}
MyClass(const MyClass& p) 拷贝构造函数
{
}
~MyClass() 析构函数
{
statement;
}
};
调用
main()
{
1、括号发
MyClass p1; 默认构造 ,在进行默认构造的时候不能加括号,加括号
编译器会认为是一个函数声明。
MyClass p2(参数); 有参构造
MyClass p3(p1); 拷贝构造
2、显示法
MyClass p4 = MyClass(参数); 相当于 MyClass p4(参数); //有参构造
MyClass P5 = MyClass(p4); 相当于 MyClass p5(p5); //拷贝构造
注意事项:
① 这里Person(参数)匿名对象 特点:当前行执行结束后,系统会立即回收掉匿名对象
② 不要利用拷贝构造函数,初始化匿名对象编译器会认为 Person(p3)=====Person p3;
3、隐式转换法
MyClass P6 = 参数 ; 相当于 MyClass p6(参数); //有参构造
MyClass P7 = P6; 相当于 MyClass p7(p6); //拷贝构造
}
4、初始化列表
class MyClass
{
public:
传统初始化操作
MyClass(int a, int b, int c)
{
m_A = a;
m_B = b;
m_C = c;
}
利用初始化列表操作
MyClass(int a , int b, int c):m_A(a), m_B(b), m_C(c)
{
}
int m_A;
int m_B;
int m_C;
};
int main()
{
MyClass mc(1,2,2);
}