C++的类和对象

来源:互联网 发布:rimworld for mac 编辑:程序博客网 时间:2024/06/01 08:59

关于类的认识:类和结构体的异同

类:在C++中对象的类型称为类,类是对象的抽象,对象是类的具体实例,类是抽象的,不占内存,而对象确是具体的占有一定的内存。

在C++中结构体不仅可以存放数据还可以存放函数。

举例1:

struct student{char name[20];int age;char gender[3];void PrintStudent(){cout << "XiaoMing is a boy" << endl;}};int main(){    student p;p.age = 20;strcpy(p.gender, "男");strcpy(p.name, "XiaoMing");p.PrintStudent();system("pause");return 0;}
可见程序能够正确编译链接输出正确的结果。

对于用结构体声明的类如果对其成员不做privata和public的声明则默认为public的

由上述例子就可以看出来这一点默认为公有的因此在类域外也可以直接访问成员。

举例2、

#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<stdlib.h>using namespace std;class Time{public:  void setTime(); void showTime();private:int hour;int minute;int second;};int main(){Time t;t.setTime();t.showTime();system("pause");}void Time::setTime(){cin >> hour;cin >> minute;cin >> second;}void Time::showTime(){cout <<hour << ":" << minute << ":" << second << endl;}struct student{char name[20];int age;char gender[3];void PrintStudent(){cout << "XiaoMing is a boy" << endl;}};
这个例子则向我们展示了如何在类外定义成员函数:

而我们知道在类中定义成员函数是不需要加类名的,而在类外定义成员函数需要加上它的类名和作用于限定符。

对于上述两个例子进行比较我们可以看出两个的功能是一样的但是在用struct 声明的类和用 class声明的类是有区别的就在于不用private和public时他默认的一个是公有的,而另一个是默认为私有的。

关于定义对象的三种方法:

1、先声明类类型再定义类对象

Student stud1,stud2;

应该说明在C++中,在声明了类类型后,定义对象有两种形式

(1)class 类名 对象名

如 class Time t

(2)类名 对象名

Time t

在上述第二个例子中我们看出先声明再定义的类对象,并且用的第二种方式。

第一种方式从C语言继承下来的而明显第二种更具有C++的特色。

2、在声明类类型的同时定义类对象

例3、

class Data{public :void Print(){cout << "thank you" << endl;}private:int a;char b;double c;}data;int main(){ data.Print();system("pause");return 0;}

3、不出现类名直接定义对象

例4、

class{public :void FunTest(){;}private :int a;char b;}st1,st2;//直接定义了两个无类名的对象int main(){system("pause");return 0;}

这种方法是可行的但并不提倡因为通常情况下类的声明和类的使用是分开的,便于封装。

inline 成员函数

类的成员函数也可以指定为内置函数


在类体中定义的成员函数规模一般都很小,而系用调用函数的过程所花费的时间开销是相对比较大的。调用一个函数的时间开销远远大于小规模函数体中全部语句的执行时间,为了减少时间开销,如果在类体中定义的成员函数中不包括循环等控制结构,C++系统会自动将它们作为内置函数来处理,也就是说,在程序调用这些成员函数的时候,并不是真正执行函数的调用过程(如保留返回地址等处理),而是把函数代码嵌入到程序的调用点,这样可以大大减少调用成员函数的时间开销。

C++要求对一般的内置函数要用关键字inline 声明,但对类内定义的成员函数,可以忽略inline ,因为这些成员函数已被隐含的指定为内置函数。在例

中void Print()函数已经被隐含的指定为内置函数。


但应该注意的是如果成员函数不在类体中定义,而在类体外定义如例2,系统并不把它默认为内置函数,调用这个成员函数和调用普通函数的过程是一样的,如果想要将这些成员函数指定为内置函数,应当用inline 做显式声明。


例如将例2改一下  inline void Time ::setTime()

但是将一般函数置为内置函数的时候,只要在函数的声明或函数的定义时对两者之一加上inline声明即可。

但是要注意:将类函数指定为内置函数的时候,应当注意如果在类体外定义inline 函数则必须将类定义和成员函数的定义都放在同一个头文件中,否则编译时无法进行置换(把函数代码嵌入到程序的调用点),但是这样做不利于类的接口与类实现分离。因此从工程质量上来谁,这样做并不是好办法。

只有在类外定义的成员函数规模小并且调用频率高时,才采用此类做法。


一个对象所占的空间大小只取决于该对象中数据成员所占的空间而与成员函数无关,并且对象的数据成员变量也和结构体一样要遵循内存对齐(1、成员对齐,2、整体对齐:最大成员对其数和默认对齐数相比的较小值)


对象成员的引用(3种方式)

1、通过对象名和成员运算符访问对象中的成员

3、通过对像的指针访问对象中的成员

3、通过对象的引用变量访问对象中的成员

-------------------------------------------------------------------------------------------------

1、对象名.对象中的成员名

如例2中的 t.setTime

2、对象的指针->对象中的成员

例如将例2稍作改动

#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<stdlib.h>using namespace std;class Time{public:  void setTime(); void showTime();private:int hour;int minute;int second;};int main(){Time p,*t;t = &p;t->setTime();t->showTime();system("pause");}void Time::setTime(){cin >> hour;cin >> minute;cin >> second;}void Time::showTime(){cout <<hour << ":" << minute << ":" << second << endl;}


3、通过对象的引用变量访问对象中的成员

我们再将例2稍作改动

#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<stdlib.h>using namespace std;class Time{public:  void setTime(); void showTime();private:int hour;int minute;int second;};int main(){Time p;Time &t = p;t.setTime();t.showTime();system("pause");}void Time::setTime(){cin >> hour;cin >> minute;cin >> second;}void Time::showTime(){cout <<hour << ":" << minute << ":" << second << endl;}






1 0
原创粉丝点击