1. 类(class)
1.1 类的概念
- **类(class):**是面向对象程序设计中的概念,是面向对象编程的基础,是对对象的抽象,对象是对客观事物的抽象。
- **类(class):**是一种抽象的数据类型,是一种复合数据类型,类类型。
- **类的构成:**包括成员变量和成员函数。
- 类(class):是对现实生活中一类具有共同特征的事物的抽象。如果一个程序里提供的类型与应用中的概念有直接的对应,这个程序就会更容易理解,也更容易修改。一组经过很好选择的用户定义的类会使程序更简洁。此外,它还能使各种形式的代码分析更容易进行。特别地,它还会使编译器有可能检查对象的非法使用。
注:在面向对象程序设计中,程序员不需要考虑数据结构和操作函数,只需要考虑对象即可。
1.2 类的声明
-
类的声明(declare),称为前向声明(forward declaration),在程序中引入了类类型的类名,基本型式如下:
class 类名;
-
注意事项:
(1)在类声明之后,定义之前,类是一不完全类型,即已知其实个类型,但是不知道它的成员。
(2)不完全类型只能用于定义指向该类型的指针和引用,或者用于声明使用该类型作为形参类型或者返回类型的函数。返回类型 函数名(类名 &对象); 返回类型 函数名(类名 *对象);
-
代码示例:
#include <iostream> #include <string> using namespace std; class B; class A { public: A(){} ~A(){} public: void set_name(B &ptr_B, string name); string get_name(B *ptr_B); }; class B { public: B() : _name("class B"){} ~B(){} public: void set_name(string name){_name = name;} string get_name(){return _name;} private: string _name; }; void A::set_name(B &ptr_B, string name) { ptr_B.set_name(name); } string A::get_name(B *ptr_B) { cout<<ptr_B->get_name()<<endl; return ptr_B->get_name(); } int main(int argc, char *argv[]) { B b; A a; a.set_name(b, "向前声明class B"); a.get_name(&b); system("pause"); return 0; } =>向前声明class B
1.3 类的定义
-
类的定义(define), 在创建类的对象之前,必须完整的定义该类,而不只是声明类,基本型式如下:
class 类名 { public: 公有成员 private: 私有成员 protected: 保护成员 };
-
注意事项:
**(1)类名:**遵循一般的命名规则,字母,数字和下划线组合,不要以数字开头。
(2)访问限制: public,private,protected为访问限制关键字。
**(2)类成员:**类可以没有成员,也可以定义多个成员。成员可以是数据、函数或类型别名。所有的成员都必须在类的内部声明。没有成员的类是空类,空类也占用空间。如:
class People{};
sizeof(People) = 1;
**(3)成员变量:**成员变量必须在类内部定义,可以在类内部或类外部进行初始化。不能使用 auto、extern和register等进行修饰,也不能在定义时进行初始化。
**(4)成员函数:**成员函数必须在类内部声明,可以在类内部定义,也可以在类外部定义。如果在类内部定义,就默认是内联函数。可以有多个重载成员函数,个数不限。
**(5)构造与析构函数:**构造函数是一个特殊的、与类同名的成员函数,用于给每个数据成员设置适当的初始值。析构函数是一个特殊的、与类同名(只是在函数名前面加一个位取反符~)的成员函数,用来做“清理善后” 的工作。
**(6)结尾部分的分号:**必不可少,否则会发生编译错误。
(7)类不能具有自身类型的数据成员,但可以包含指向本类的指针或引用。class ListNode { public: int num; ListNode *next; };
-
代码示例:
#include <iostream> #include <string> using namespace std; class ListNode { public: string name; int num; ListNode *next; }; int main(int argc, char *argv[]) { ListNode x, y, z, *head, *p; x.name = "123"; x.num = 1; y.name = "456"; y.num = 4; z.name = "789"; z.num = 7; head = &x; x.next = &y; y.next = &z; z.next = NULL; p = head; while(p) { cout<<p->name<<"\t"<<p->num<<endl; p = p->next; } system("pause"); return 0; } =>123 1 456 4 789 7
**参考文献: **
[1]《C++全方位学习》范磊——第六章
[2]《C++程序设计教程(第二版)》钱能——第八章
[3] 百度搜索关键字:类、类的三大特性、类与结构体的区别