C++类

来源:互联网 发布:jq ajax获取json数据 编辑:程序博客网 时间:2024/05/29 15:20

C++中类以class 关键字声明

class MyClass{public:int s;};

值得注意到是在末尾要加上;

数据结构:

权限public公共:内外都可调用protect内部或其子类中调用private仅仅内部静态数据为该类的公共数据,也就是该类的所有变量的该数据都相同。

友元函数:

class T{public:friend int FUN(void * p);private :int x;}int FUN(void * p){return ((T*)p)->x;}如此便可以从外部访问私有数据了。不过这破坏了封装性,倒不如当初设计好点。类在参数传递中传递的是值,而不是地址。就像int类型的参数,改变参数的值并不会影响原来的数据。类的函数:类之所以可以表示物件是应为:他不但有实体:数据,也有动作:函数。一个现实中的物体都有产生和消亡,故类也应有:构造和析构。然后才是相符的操作。class TEST{public:TEST();//构造函数于类同名TEST(int v);//且可以多个~TEST();//析构函数。该函数用于清理内存。int这类局部变量系统会自动收回,但使用了new就必须手动清除。}TEST::~TEST(){}//我们可以让他什么都不做,但不能不定义。运算符,operator 运算符重载的规则1.友元运算符的参数规则与类成员运算符的参数规则不同, 一员运算符必须显式地声明一个参数, 二员运算符必须显式地声明两个参数. 类成员运算符重载时, 参数中隐含了一 个this指针.2. 重载运算符不能改变原有运算符的优先级, 结合性和操作数个数. 3. 重载运算符不能使用缺省参数. 4. 除赋值运算符外, 重载运算符可由派生类继承下去. 5. 运算符=、()、[]和->可作为类成员运算符, 不能作为友员运算符. 6. 运算符“.”、“::” 、“?:” 不能重载.int _tmain(int argc, _TCHAR* argv[]){while(1){T a('a'),b('b'),*p;p=&(a+b);//会调用析构函数p->n[0]=2;//仍然可以访问}}本来设计的初衷是返回一个连接a,b的T类型的指针。然而却有着很大的问题:1.a,b,和new生成的n 的析构函数都被调用了。2.析构以后,其占用的资源没有被释放。问题 1:如果将重载运算符作修改重载运算 2赋值语句改为:p=a+&b;那么就不会调用析构函数。这里的差别就是函数返回T和T*,这里就想到了传值和传址。这里应该是由于传值时,自动产生的,也应自动销毁。于是就调用了析构函数。于是自然想到了解决方案:重载运算 3 (这里用了引用类型)经过测试,确实不会调用析构函数了。 然而我们不该忽略一点:在原来的函数里,函数返回的是拷贝到值,我们用&,取得的是这个拷贝的地址。拷贝会自动销毁,但我们利用这个指针却依然可以访问。难道其实它并没有被销毁?问题2:我用改进的方案取得地址,再调用析构函数,依然可以访问,资源也没有被释放。也就是析构函数失效了!其实是析构函数只是做销毁前的动作,并不会把资源消除也许是思维定势把,析构函数应该放置的是delete,就当T类的变量为一个局部变量。系统会自动的销毁它,而对于指针,系统不会去销毁它所对应的资源。故析构函数的作用就是手动的处理它们。经过测试,delete 类T时会调用~T,(新发现?还是编译器的问题,我用的是VS2010)所以需要将析构函数改成:~T(){cout<<w<<":delete\n";if(pre) {//pre->~T();delete pre;}if(next){// next->~T ();delete next;}}这样就可以了。




原创粉丝点击