C++中class的简单使用

来源:互联网 发布:android 线程数据传递 编辑:程序博客网 时间:2024/06/09 16:37

A class is the collection of related data and function under a single name. A C++ program can have any number of classes. When related data and functions are kept under a class, it helps to visualize the complex problem efficiently and effectively. When a class is defined, no memory is allocated.

在C++中,用”类”来描述”对象”。类是属于用户自定义的数据类型,并且该类型的数据具有一定的行为能力。通常来说,一个类的定义包含两部分的内容,一是该类的属性,另一部分是它所拥有的方法。

C++中使用关键字class来定义类。类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(instance),拥有类的成员变量和成员函数。

与结构体一样,类只是一种复杂数据类型的声明,不占用内存空间。而对象是类这种数据类型的一个变量,占用内存空间。

类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存空间。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类型,本身不占用内存空间,而变量的值则需要内存来存储。

类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是:成员函数是一个类的成员,出现在类体中,它的作用范围由类来决定。在类体中和类体外定义成员函数是有区别的:在类体中定义的成员函数为内联(inline)函数,inline关键字可加可不加;在类体外定义的不是,即使加了inline,有时也不一定会宏展开。使用一个内联函数,编译器试图用函数体中的代码替换调用函数的地方的函数名,从而达到消除函数调用时的时间开销的目的。

类的数据成员和函数成员都可以被声明为静态的。

成员函数有一个隐含的附加形参,即指向该对象的指针,这个隐含的形参叫this指针。使用this指针保证了每个对象可以拥有不同数值的数据成员。每个对象都有一个特殊的指针,它指向对象本身。

C++通过public、protected、private三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符:(1)、在类内部,无论成员变量或成员函数被声明为public、protected还是private,都是可以互相访问的,无访问权限限制;(2)、在类外部,类创建的对象无法访问private、protected属性的成员变量和成员函数,而仅可以访问public属性的成员变量和成员函数。

C++中类必须先定义,才能够实例化。前向声明的类不能实例,但可以定义指针或引用。

类也可以定义在函数体内,这样的类被称为局部类。局部类只在定义它的局部域内可见。局部类的成员函数必须被定义在类体中。局部类中不能有静态成员。

一个类的构造函数是一种特殊的函数,在创建一个类的新对象时调用它。它可以通过声明一个与class同名的函数来定义。当且仅当要生成一个class的新的实例(instance)的时候,也就是当且仅当声明一个新的对象,或给该class的一个对象分配内存的时候,这个构造函数将被自动调用。构造函数的永远没有返回值,也不用声明void。构造函数可以被多次重载,但有不同的参数类型和个数。当没有明确定义构造函数的时候,编译器会自动假设两个重载的构造函数(默认构造函数(default constructor)和复制构造函数(copy constructor))。这两个默认构造函数只有在没有其它构造函数被明确定义的情况下才存在。如果任何其它有任意参数的构造函数被定义了,这两个构造函数就都不存在了。在这种情况下,如果你想要有default constructor和copy constructor,就必须自己定义它们。

析构函数也是一个特殊的函数,当创建对象被删除时调用它。它在对象被从内存中释放的时候被自动调用。析构函数必须与class同名,加”~”前缀,必须无返回值。析构函数特别适用于当一个对象被动态分配内存空间,而在对象被销毁的时候我们希望释放它所占用的空间的时候。

拷贝构造函数是一个构造函数。它创建一个对象并用之前已经创建好的一个同类的对象对其进行初始化。

一个友元(friend)函数允许完全访问类的私有成员和保护成员。

在C++中,class与struct的区别:(1)、默认的继承访问权限:struct是public的,class是private的;(2)、成员的默认访问权限:struct默认是public权限,class默认是private权限;(3)、”class”关键字还用于定义模板参数,就像”typename”,但关键字”struct”不能用于定义模板参数。

C++中class的使用例子太多了,这里简单的举了2个例子,并不全面,不具代表性:

#include "class.hpp"#include <iostream>///////////////////////////////////////// reference: http://www.cplusplus.com/doc/tutorial/classes/class Circle {private:double radius;public:Circle(double r) : radius(r) { }double area() { return radius*radius*3.14159265; }};class Cylinder {private:Circle base;double height;public:Cylinder(double r, double h) : base(r), height(h) {}double volume() { return base.area() * height; }};int test_class1(){Cylinder foo(10, 20);std::cout << "foo's volume: " << foo.volume() << '\n';return 0;}////////////////////////////////////////////////////// reference: http://www.cs.rochester.edu/u/nelson/courses/csc_173/review/CppClasses.htmlclass Complex{private:double re;double im;public:Complex(float r, float i) { re = r; im = i; }Complex(float r) { re = r; im = 0.0; }~Complex() {};double Magnitude();        // calculate magnitudedouble Real() { return re; } // return real partinline double Imag();      // return imaginary partComplex operator+(Complex b){return Complex(re + b.re, im + b.im);}Complex operator=(Complex b){re = b.re; im = b.im;return *this;}};inline double Complex::Imag(){return im;}double Complex::Magnitude(){return sqrt(re*re + Imag()*Imag());}int test_class2(){Complex a(1.0, 1.0);Complex b(5.0);printf("a real = %f  a imaginary = %f\n", a.Real(), a.Imag());printf("b real = %f  b imaginary = %f\n", b.Real(), b.Imag());return 0;}

GitHub:https://github.com/fengbingchun/Messy_Test

0 0
原创粉丝点击