c++类与对象


面向对象的程序设计方法,能够较好结构化设计方法中遇到的问题。
面向对象的程序 = 类 + 类 + …+ 类

1、面向对象的程序设计方法:

将某类客观事物共同特点(属性)归纳出来,形成一个数据结构(可以用多个变量描述事物的属性);
将这类事物所能进行的行为也归纳出来,形成一个个函数,这些函数可以用来操作数据结构(这一步叫“抽象”)。
然后,通过某种语法形式,将数据结构和操作该数据结构的函数“捆绑”在一起,形成一个“类”,从而使得数据结构和操作该数据结构的算法呈现出显而易见的紧密关系,这就是“封装”。
面向对象的程序设计具有:
-“抽象”
-“封装”
-“继承”
-“多态”
四个基本特点。
面向对象的程序设计模式:

2、举例:
将长、宽变量和设置长,宽,求面积,以及求周长的三个函数“封装”在一起,就能形成一个“矩形类”。

长、宽变量成为该“矩形类”的“成员变量”,三个函数成为该类的“成员函数” 。 成员变量和成员函数统称为类的成员。

class CRectangle {
 public: 
    int w, h;
    int Area() { 
            return w * h;
     }
     int Perimeter(){ 
            return 2 * ( w + h); 
     } 
     void Init( int w_,int h_ ) {
             w = w_; h = h_; 
             } 
 }; //必须有分号

int main( ) 
{ 
        int w,h; 
        CRectangle r; //r是一个对象 
        cin >> w >> h; 
        r.Init( w,h); 
        cout << r.Area() << endl << r.Perimeter();      
        return 0; 
}

通过类,可以定义变量。类定义出来的变量,也称为类的实例,就是我们所说的“对象”
类的名字就是用户自定义的类型的名字。可以象使用基本类型那样来使用它。

和结构变量一样,对象所占用的内存空间的大小,等于所有成员变量的大小之和。

每个对象各有自己的存储空间。一个对象的某个成员变量被改变了,不会影响到另一个对象。

和结构变量一样,对象之间可以用 “=”进行赋值,但是不能用 “==”,“!=”,“>”,“<”“>=”“<=”进行比较,除非这些运算符经过了“重载”。

3、用法

[1] 用法1:对象名.成员名

        CRectangle r1,r2; 
        r1.w = 5; 
        r2.Init(5,4);

Init函数作用在 r2 上,即Init函数执行期间访问的 w 和 h是属于 r2 这个对象的, 执行r2.Init 不会影响到 r1。

[2 ] 用法2:指针->成员名

    CRectangle r1,r2; 
    CRectangle * p1 = & r1; 
    CRectangle * p2 = & r2; 
    p1->w = 5; 
    p2->Init(5,4); //Init作用在p2指向的对象上

[ 3] 用法3:引用名.成员名

    CRectangle r2;
    CRectangle & rr = r2;
    rr.w = 5;
    rr.Init(5,4); //rr的值变了,r2的值也变
    
    void PrintRectangle(CRectangle & r)
    { 
        cout << r.Area() << ","<< r.Perimeter(); 
    }
    CRectangle r3;
    r3.Init(5,4);
    PrintRectangle(r3);

4、类成员的可访问范围

在类的定义中,用下列访问范围关键字来说明类成员可被访问的范围:

–private: 私有成员,只能在成员函数内访问
–public : 公有成员,可以在任何地方访问
–protected: 保护成员。

如过某个成员前面没有上述关键字,则缺省地被认为是私有成员。
类成员的可访问范围

    class Man {
        int nAge; //私有成员
        char szName[20]; // 私有成员
    public:
        void SetName(char * szName){
            strcpy( Man::szName,szName);
        }
    };

在类的成员函数内部,能够访问:
–当前对象的全部属性、函数;
–同类其它对象的全部属性、函数。
在类的成员函数以外的地方,只能够访问该类对象的公有成员。

    class CEmployee {
        private: 
            char szName[30]; //名字 
        public : 
            int salary; //工资 
            void setName(char * name); 
            void getName(char * name); 
            void averageSalary(CEmployee e1,CEmployee e2); 
    }; 
    void CEmployee::setName( char * name) { 
            strcpy( szName, name); //ok 
    } 
    void CEmployee::getName( char * name) { 
            strcpy( name,szName); //ok 
    }
    void CEmployee::averageSalary(CEmployee e1, CEmployee e2){
        cout << e1.szName; //ok,访问同类其他对象私有成员 
         salary = (e1.salary + e2.salary )/2; 
     } 
     int main() 
     { 
        CEmployee e;        
        strcpy(e.szName,"Tom1234567889"); //编译错,不能访问私有成员 
        e.setName( "Tom"); // ok 
        e.salary = 5000; //ok 
        return 0; 
     }

5、构造函数 (constructor)
成员函数的一种

名字与类名相同,可以有参数,不能有返回值(void也不行)
作用是对对象进行初始化,如给成员变量赋初值
如果定义类时没写构造函数,则编译器生成一个默认的无参数的构造函数
默认构造函数无参数,不做任何操作
如果定义了构造函数,则编译器不生成默认的无参数的构造函数
对象生成时构造函数自动被调用。对象一旦生成,就再也不能在其上执行构造函数
一个类可以有多个构造函数

class Complex { 
            private : 
                double real, imag; 
            public: 
                void Set( double r, double i); 
}; //编译器自动生成默认构造函数 
Complex c1; //默认构造函数被调用 
Complex * pc = new Complex; //默认构造函数被调用

6、复制构造函数 copy constructor
只有一个参数,即对同类对象的引用。
形如 X::X( X& )或X::X(const X &), 二者选一 后者能以常量对象作为参数
如果没有定义复制构造函数,那么编译器生成默认复制构造函数。默认的复制构造函数完成复制功能

class Complex { 
        private : 
            double real,imag; 
}; 
Complex c1; //调用缺省无参构造函数 
Complex c2(c1);//调用缺省的复制构造函数,将 c2 初始化成和c1一样

如果定义的自己的复制构造函数, 则默认的复制构造函数不存在。

class Complex { 
        public : 
            double real,imag; 
        Complex(){ } 
        Complex( const Complex & c ) { 
            real = c.real; 
            imag = c.imag; 
            cout << “Copy Constructor called”; 
        } 
}; 
Complex c1; 
Complex c2(c1);

复制构造函数起作用的三种情况

当用一个对象去初始化同类的另一个对象时。

Complex c2(c1);
Complex c2 = c1; //初始化语句,非赋值语句

如果某函数有一个参数是类 A 的对象, 那么该函数被调用时,类A的复制构造函数将被调用。

void Func(A a1){ }
 int main()
 { 
        A a2; 
        Func(a2); 
        return 0;
 }

如果函数的返回值是类A的对象时,则函数返回时, A的复制构造函数被调用:

class A 
{ 
    public: int v; 
    A(int n) { v = n; }; 
    A( const A & a) { 
        v = a.v; 
        cout << "Copy constructor called" <<endl; 
    } 
};

hhaowang

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,763评论 2 9
  • 1.1面向对象的思想 以计算圆周长和面积的问题为例:面向过程的程序设计语言使用高级语言提供的数值计算工具,从功能入...
    苏字龙阅读 603评论 0 1
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,519评论 1 51
  • 7.1 类和对象的定义 7.1.1 基本概念   和结构体一样,在程序设计语言中,一个类是一种新的数据类型。  在...
    quliikay阅读 481评论 0 0
  • 大半夜,看着人来人往,谁都不知道谁的故事,可是还是一如既往的在你身边经过!这个世界有时候真大,觉得可以仗剑走天涯;...
    林惠疯阅读 170评论 0 0