对象成员

--------------siwuxie095

对象成员

在对象中包含其它对象是一种非常普遍的现象

以坐标系中的线段为例:说明对象成员的定义和使用方法

如果要定义一个如上图所示的线段类,每条线段都由两个点连接而形成,

这意味着,需要定义一个表示点的类,该点类包含横坐标和纵坐标,而

线段类包含两个坐标对象

可见,要描述清楚这个数学问题,至少要定义两个类:一个定义坐标的

点,另一个定义点上的线段

坐标类:Coordinate

线段类:Line

定义完成后,通过实例化来描述一条线段:

当实例化 Line 对象时,会先实例化 A 点,再实例化 B 点,

最后实例化 Line 对象

当销毁 Line 对象时,先销毁 Line 对象,再销毁 B 点,最后

销毁 A 点

「创建与销毁的过程正好相反」

这就像制造一辆汽车,肯定要先把各个零部件造好,然后再按照图纸

把汽车装配起来,当要拆除一辆汽车时,也是按照图纸把各个零件先

拆开,然后再分解各个零件

但刚才的构造函数并没有参数,作为线段类来说,它的两个点其实应该

可以由调用者来确定的,即 这两个点在 Line 对象实例化时就能通过给

构造函数传参,从而使这两个点生成在确定的位置上

坐标类 Coordinate 的构造函数应该有参数:

线段类 Line 的构造函数也应该有参数:

如果想将 x1、y1 传值给第一个点,x2、y2 传值给第二个点,单独写成

下面的形式是有问题的

需要对代码进行进一步的改进:给 Line 类的构造函数配备初始化列表,

在初始化列表中实例化 m_coorA 和 m_coorB,且将 Line 传入的 4 个

参数分配到两个对象成员中

程序 1:

Coordinate.h:


class Coordinate

{

public:

Coordinate();

~Coordinate();

void setX(int x);

int getX();

void setY(int y);

int getY();

private:

int m_iX;

int m_iY;

};

Coordinate.cpp:


#include "Coordinate.h"

#include <iostream>

using namespace std;

Coordinate::Coordinate()

{

cout << "Coordinate()" << endl;

}

Coordinate::~Coordinate()

{

cout << "~Coordinate()" << endl;

}

void Coordinate::setX(int x)

{

m_iX = x;

}

int Coordinate::getX()

{

return m_iX;

}

void Coordinate::setY(int y)

{

m_iY = y;

}

int Coordinate::getY()

{

return m_iY;

}

Line.h:


#include "Coordinate.h"

class Line

{

public:

Line();

~Line();

void setA(int x, int y);

void setB(int x, int y);

void printInfo();

private:

Coordinate m_coorA;

Coordinate m_coorB;

};

Line.cpp:


#include "Line.h"

#include <iostream>

using namespace std;

Line::Line()

{

cout << "Line()" << endl;

}

Line::~Line()

{

cout << "~Line()" << endl;

}

void Line::setA(int x, int y)

{

m_coorA.setX(x);

m_coorA.setY(y);

}

void Line::setB(int x, int y)

{

m_coorB.setX(x);

m_coorB.setY(y);

}

void Line::printInfo()

{

cout << "(" << m_coorA.getX() << "," << m_coorA.getY() << ")" << endl;

cout << "(" << m_coorB.getX() << "," << m_coorB.getY() << ")" << endl;

}

main.cpp:


#include <stdlib.h>

#include "Line.h"

#include <iostream>

using namespace std;

//演示Line对象和其对象成员的调用顺序

int main(void)

{

// 或 Line *p = new Line;

Line *p = new Line();

//Line类对象在创建时先执行对象成员的构造函数,

//再执行对象的构造函数析构函数则相反

delete p;

p = NULL;

system("pause");

return 0;

}

运行一览:

程序 2:

Coordinate.h:


class Coordinate

{

public:

Coordinate(int x,int y);

~Coordinate();

void setX(int x);

int getX();

void setY(int y);

int getY();

private:

int m_iX;

int m_iY;

};

Coordinate.cpp:


#include "Coordinate.h"

#include <iostream>

using namespace std;

Coordinate::Coordinate(int x,int y)

{

m_iX = x;

m_iY = y;

cout << "Coordinate() " <<m_iX<<","<<m_iY<< endl;

}

Coordinate::~Coordinate()

{

cout << "~Coordinate() " << m_iX << "," << m_iY << endl;

}

void Coordinate::setX(int x)

{

m_iX = x;

}

int Coordinate::getX()

{

return m_iX;

}

void Coordinate::setY(int y)

{

m_iY = y;

}

int Coordinate::getY()

{

return m_iY;

}

Line.h:


#include "Coordinate.h"

class Line

{

public:

Line(int x1,int y1,int x2,int y2);

~Line();

void setA(int x, int y);

void setB(int x, int y);

void printInfo();

private:

Coordinate m_coorA;

Coordinate m_coorB;

};

Line.cpp:


#include "Line.h"

#include <iostream>

using namespace std;

//初始化列表

//如果对象成员所在类有默认构造函数那么这个地方就不需要初始化列表

Line::Line(int x1, int y1, int x2, int y2) :m_coorA(x1, y1), m_coorB(x2,y2)

{

cout << "Line()" << endl;

}

Line::~Line()

{

cout << "~Line()" << endl;

}

void Line::setA(int x, int y)

{

m_coorA.setX(x);

m_coorA.setY(y);

}

void Line::setB(int x, int y)

{

m_coorB.setX(x);

m_coorB.setY(y);

}

void Line::printInfo()

{

cout << "(" << m_coorA.getX() << "," << m_coorA.getY() << ")" << endl;

cout << "(" << m_coorB.getX() << "," << m_coorB.getY() << ")" << endl;

}

main.cpp:


#include <stdlib.h>

#include "Line.h"

#include <iostream>

using namespace std;

//让线段在创建时就将两个点一起确定下来

int main(void)

{

Line *p = new Line(1,2,3,4);

p->printInfo();

delete p;

p = NULL;

system("pause");

return 0;

}

运行一览:

【made by siwuxie095】

时间: 2024-11-24 03:26:24

对象成员的相关文章

C++对象模型对象成员的效率 (Object Mem ber Efficiency)(第三章) .

3.5 对象成员的效率 (Object Mem ber Efficiency) 下面某个测试,目的在测试聚合(aggregation).封装(encapsulation),以及继承(Inheritance)所引发的额外负荷的程度.所有测试都是以个别局部变量的加法,减法,赋值(assign)等操作的存取成本为依据.下面就是个别的局部变量: float pA_x = 1.725, pA_y = 0.875, pA_z = 0.478; float pB_x = 0.315, pB_y = 0.317

类成员和对象成员

3.7   类数据成员和类成员函数 到目前为止,我们所看到的数据成员和成员函数都是属于对象的.比方说,我们在3.6节定义了Task类,如果我们用Task类定义如下两个对象: 那么,这两个对象都拥有各自的id.st.ft和logFile数据成员.C++还支持另外一种类型的成员,这种成员属于类本身,而不属于类的对象,我们称之为类成员(class member),而将属于对象的成员称为对象成员(object member)或实例成员(instance member).使用关键字static就可以创建一

C++对象模型——对象成员的效率 (Object Member Efficiency)(第三章)

3.5 对象成员的效率 (Object Mem ber Efficiency) 以下某个測试,目的在測试聚合(aggregation).封装(encapsulation),以及继承(Inheritance)所引发的额外负荷的程度.全部測试都是以个别局部变量的加法,减法,赋值(assign)等操作的存取成本为根据.以下就是个别的局部变量: float pA_x = 1.725, pA_y = 0.875, pA_z = 0.478; float pB_x = 0.315, pB_y = 0.317

MFC 调用默认对话框类对象成员和方法

这个功能其实并不常用,然而在多线程和回调函数中要调用默认对话框类的对象成员或方法还是可能要用到的,所以做下记录. 首先声明一个全局变量用以存储默认对话框类对象指针: LPVOID pParam;//对话框对象指针 在默认对话框类的初始化函数中给该指针进行赋值: pParam = (void *)this; 在需要调用默认对话框类对象成员或方法处,通过如下代码实现调用: CPanoramicPlayerDlg *dlg = (CPanoramicPlayerDlg *)lpParam;//其中CP

警察和厨师为Polic类和Cook类增加了对象成员,请扩充代码

/* *Copyright (c) 2016,烟台大学计算机学院 *All rights reserved. *文件名称:main.cpp *作 者:郭辉 *完成时间:2016年5月10日 *版 本 号:v1.0 * *问题描述:项目-警察和厨师为Polic类和Cook类增加了对象成员,请扩充代码. *输入描述:无. *程序输出:信息. */ #include<iostream> #include <string> using namespace std; class Person

C++之对象成员指针

对象成员指针:对象的指针作为另外一个类的成员 对象成员指针既可以用初始化列表进行初始化,也可以使用普通构造函数进行初始化 对象成员指针常见的初始化方式和销毁方式 原文地址:https://www.cnblogs.com/xjyxp/p/11238760.html

c++对象成员的引用---12

原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 在程序中经常需要访问对象中的成员.访问对象中的成员可以有3种方法: 通过对象名和成员运算符访问对象中的成员: 通过指向对象的指针访问对象中的成员: 通过对象的引用变量访问对象中的成员. 通过对象名和成员运算符访问对象中的成员 例如在程序中可以写出以下语句: stud1.num=1001; //假设num已定义为公用的整型数据成员 表示将整数1001赋给对象stud1中的数据成员num.其中“.”是成员

C#面向对象&mdash;&mdash;对象成员、方法重载、引用类库等

一.方法重载: 1.两个函数同名,就互相构成方法的重载关系 2.重载的函数,必须跟其他函数之间具有不同的参数类型或参数个数 二.字段与属性 类的字段: 类里面是可以直接定义变量的,这些变量就叫类的字段,也叫成员变量. 类的属性(扳手): 本身不存储数据,用来给字段赋值和取值的一个存取过程.可以保护字段. 包含读访问器和写访问器两个函数: 读访问器 get { return Name; } 写访问器 set {                 if(value.Length<=3)        

【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法

. 一. 类定义 类定义需要实现两部分 : -- 接口部分 : 定义类的成员变量和方法, 方法是抽象的, 在头文件中定义; -- 实现部分 : 引入接口部分的头文件, 实现抽象方法; 1. 接口部分定义 (1) 接口部分定义格式 接口部分定义格式 : @interface className : superClassName { type _variableName; ... ... } - (type) methodName : type parameterName; @end -- 接口定义