C++学习笔记(二):类和对象
2013-03-07 21:17
246 查看
类是对象共性的抽象,一种自定义的数据类型,可认为是C语言中结构体的拓展。它的作用是将数据和算法(数据操作)封装在用户自定义的抽象数据类型中。
为什么要在C++中添加类这样一种“工具“呢? 程序中的每一组数据都是为某一种操作而准备的。而数据的交叉使用容易导致数据被误操作,影响程序的正常运行。因此大牛们想到了把相应的数据和操作封装在一起,构成对象。
类包含数据和算法,并且他们都可以有两种属性:public和private。(注意类的声明是一个语句,所以不要忘记在最后的花括号后加分号。)
一般来说为了保证数据信息的隐蔽,数据都定义为private,不可被除成员函数之外的程序调用。而定义为public的成员函数作为类提供的功能的实现,成为了对外的接口,外部程序通过对此类成员函数的调用来实现对数据的操作。而定义为private的成员函数只可以被内部成员函数调用,称为”工具函数“(utility function).要注意如果在声明类时未指定成员的属性,则系统默认为是private,那么这样的类是没有任何意义的,因为它没有对外接口,不能对外提供任何功能。之前的编程习惯是先声明private属性,但现在习惯先声明public属性,这样用户就可以集中关注类所提供的功能。
成员函数可以在类内声明,类外定义,这是一种良好的习惯,可以减少类体代码的长度便于阅读,而且把类的接口和类的实现分离,从而使类更像一个黑盒,信息更隐蔽。可以这样:先建立一个头文件:student.h
“student.h”这个命令了。另外由于成员函数是在类体外定义的,故要加上作用域 student :: 这样才能表明这时定义的set函数是student类的成员函数而不是普通的函数。不在头文件中实现成员函数有它的好处:一个头文件可能会包含很多类,而所有要包含该头文件的源代码都会讲头文件的内容copy过去,这样相同的成员函数就不用多次编译,而只是在相应的成员函数实现的原文件(student.cpp)中编译一次就行了,提高了编译的速度。最后通过链接器,就可形成.exe文件了。
为什么要在C++中添加类这样一种“工具“呢? 程序中的每一组数据都是为某一种操作而准备的。而数据的交叉使用容易导致数据被误操作,影响程序的正常运行。因此大牛们想到了把相应的数据和操作封装在一起,构成对象。
类包含数据和算法,并且他们都可以有两种属性:public和private。(注意类的声明是一个语句,所以不要忘记在最后的花括号后加分号。)
一般来说为了保证数据信息的隐蔽,数据都定义为private,不可被除成员函数之外的程序调用。而定义为public的成员函数作为类提供的功能的实现,成为了对外的接口,外部程序通过对此类成员函数的调用来实现对数据的操作。而定义为private的成员函数只可以被内部成员函数调用,称为”工具函数“(utility function).要注意如果在声明类时未指定成员的属性,则系统默认为是private,那么这样的类是没有任何意义的,因为它没有对外接口,不能对外提供任何功能。之前的编程习惯是先声明private属性,但现在习惯先声明public属性,这样用户就可以集中关注类所提供的功能。
成员函数可以在类内声明,类外定义,这是一种良好的习惯,可以减少类体代码的长度便于阅读,而且把类的接口和类的实现分离,从而使类更像一个黑盒,信息更隐蔽。可以这样:先建立一个头文件:student.h
//student.h class student{ //声明一个类 public: void set (void); void display(void); private: int ID; char name[20]; char sex; int age; };再建立一个.cpp文件来实现成员函数:student.cpp
//student.cpp #include "student.h"//包含类的声明 #include <iostream>//用到了标准库中的cout和cin函数 using namespace std; void student::set(){ cout << "please input the information" << endl; cin >> ID >> name >> sex >> age; } void student::display(){ cout << name << ID << sex << age<< endl; }由类定义的对象的成员函数的实现都是一样的,只有数据成员是不一样的。若为每个对象都分配独立的数据和函数空间则是对有限内存的一种浪费。因此编译器只给每个对象分配独立的数据空间,而同一类定义的对象共享同一函数空间。通过this指针来分别是在调用哪个对象。要知道#include “ ”是一个预编译命令,它用头文件代码来覆盖(替代)这个命令。因此头文件是不可以单独编译的,只有是在包含了头文件的.cpp文件编译时才会检查它的语法错误。这样就很清楚为什么要在student.cpp中用#include
“student.h”这个命令了。另外由于成员函数是在类体外定义的,故要加上作用域 student :: 这样才能表明这时定义的set函数是student类的成员函数而不是普通的函数。不在头文件中实现成员函数有它的好处:一个头文件可能会包含很多类,而所有要包含该头文件的源代码都会讲头文件的内容copy过去,这样相同的成员函数就不用多次编译,而只是在相应的成员函数实现的原文件(student.cpp)中编译一次就行了,提高了编译的速度。最后通过链接器,就可形成.exe文件了。
相关文章推荐
- C++中的vector容器对象学习笔记
- C++学习笔记21,对象赋值
- Effective c++ 学习笔记——条款04:确定对象被使用前已先被初始化
- C++学习笔记---利用对象、引用、指针调用虚函数
- 深度探索c++对象模型学习笔记
- JNI学习笔记 C++传递结构体、String、数组对象给JavaC++传递结构体、String、数组对象给Java
- 【C++面向对象学习笔记】-基础知识
- C++对象的初始化,学习笔记
- C++学习笔记——类和对象(一)
- C++学习笔记--临时对象
- 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
- C++面向对象高级编程(上)学习笔记
- 【菜鸟C++学习笔记】10.类、对象和成员
- 学习笔记之深入浅出MFC 第8章 C++重要特性---类与对象大解剖(虚拟函数的实现方式)
- C++学习笔记序列之对象和类
- VS2010 C++ 学习笔记(三) 类和对象 访问限定符 String
- 【C++】学习笔记草稿版12(类对象的类型转换)
- C++学习笔记4:面向对象的基础之类与对象
- C++学习笔记----类与对象
- C++学习笔记一(对象和类)