通关旅

softgamer的痕迹
posts - 16, comments - 13, trackbacks - 0, articles - 0

C++体会 -- 类

Posted on 2008-07-17 17:56 softgamer 阅读(233) 评论(0)  编辑 收藏 引用 所属分类: 学习日志
  在这里不说类的概念了,大家都清楚,只是说说关于类的注意事项
  1.类的数据成员不能在类体中声明时初始化,而还是要用类的构造函数初始化,或者用set 函数赋值
  2.析构函数能不能被重载?不能,因为析构函数不能带参数,所以不能重载
  3.外部访问private类成员只能用public类接口通过public成员函数访问。尽量使所有类的成员保持private
     实现规范是 1.提供public函数,2.设置private数据成员的值,3.获得private数据成员的值
  4.提供
public成员set,get函数是重要的,它可以让用户读写private成员
  5.重点来了
     返回对private数据成员的引用,是非常危险的!!!!
     如

     #pragma once

     class CDay
     {
         public:
                 CDay( int );
                 virtual ~CDay(void);
                 void setDay( int day );
                 int  getDay();
                 int  &badsetDay( int day ); // DANGEROUS
         private:
   
                 int  Day;
      };

      #include "StdAfx.h"
      #include "Day.h"

       CDay::CDay( int day )
       {
          setDay( day );
       }

       CDay::~CDay(void)
       {
       }
       void CDay::setDay( int day )
       {
              Day = day;
       }
       int CDay::getDay()
      {
         return Day;
      }

      //Returning a ref to private data member
      int &CDay::badsetDay( int day )
      {
        Day = ( day >= 0 && day < 31 )?day:0;

         return Day;
      }

       // test1.cpp : 定义控制台应用程序的入口点。
       //

       #include "iostream"

        using namespace std;
        using namespace std;
      
        #include "Day.h"
        int _tmain(int argc, _TCHAR* argv[])
       {
             CDay c( 11 );
   
             int &Dayref = c.badsetDay( 21 );

             cout << "\n Day before mod: " << Dayref;
   
             Dayref = 41; // modied //Dangerous Function call

   
             cout << "\n Day after mod: " << c.getDay();

              //Dangerous Function call
              //a ref can be used as an lvalue

              c.badsetDay( 12 ) = 74;

              cout << "\n\n***************************\n"
                      << "badsetDay as an lvalue Day:"
                      << c.getDay()
                      << "\n*******************************\n" << endl;
   
               return 0;
         }



         结果是:
         Day before mod: 21
         Day after mod: 41 //wrong Day above 31

         ***************************
         badsetDay as an lvalue Day:74 //wrong Day above 31

         *******************************
    
 


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理