对象成员

--------------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");

return0;

}

  

  

运行一览:

  

  

  

  

  

程序 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");

return0;

}

  

  

运行一览:

  

  

  

  

  

  

  

  

  

  

【made by siwuxie095】

<think>好的,用户想了解C++中对象成员的概念和用法。我需要先明确对象成员的定义,可能包括类的成员变量和成员函数。根据提供的引用,用户可能还关心如何访问这些成员,特别是静态成员的情况。 首先,引用[3]提到类的声明和对象的定义,说明类中的成员包括私有和公有的数据成员成员函数。这里的数据成员应该就是对象成员的一部分。然后引用[1]指出,访问对象成员的方式和C语言的结构体类似,使用对象名和成员运算符,比如obj.member。 接下来,用户可能对静态成员感兴趣。引用[2]和[5]讨论了静态成员变量的声明和定义问题。比如,在类内声明静态成员后,还需要在类外进行定义,否则会导致链接错误。这一点需要重点说明,因为静态成员的初始化方式与普通成员不同。 另外,引用[4]展示了无类名的对象定义,这可能涉及到匿名类的对象成员,但这种情况较少见,可能需要简要提及。用户的问题主要围绕对象成员的使用和定义,所以应分点解释普通成员和静态成员的区别,以及如何正确初始化和访问它们。 还需要注意,用户提供的引用中有关于构造函数的内容,比如在类B的构造函数中输出信息,但静态成员A的构造没有被调用,说明静态成员需要在类外定义才能初始化。这可能涉及到静态成员的初始化时机和生命周期。 总结起来,回答的结构应该是先解释对象成员的基本概念,包括数据成员成员函数,然后说明如何访问它们,再区分普通成员和静态成员的不同处理方式,特别是静态成员的定义和初始化要点。最后,生成相关问题,帮助用户进一步学习。</think>### C++对象成员的使用与定义 #### 1. 对象成员的基本概念 对象成员是指类中包含的数据成员(变量)和成员函数(方法)。根据访问权限,可分为: - **私有成员**:通过`private`声明,仅类内可访问 - **公有成员**:通过`public`声明,允许外部访问 ```cpp class Student { private: // 私有成员 int num; char name[20]; public: // 公有成员 void display() { cout << "num:" << num << endl; } }; ``` 类声明后需要通过实例化对象来使用成员对象占内存空间,而类本身是抽象模板[^3] #### 2. 成员访问方式 - **常规成员**:通过对象名和成员运算符`.`访问 ```cpp Student s1; s1.display(); // 访问公有成员函数 ``` - **指针访问**:使用箭头运算符`->` ```cpp Student *p = &s1; p->display(); ``` 访问规则与C语言结构体成员访问完全一致[^1] #### 3. 静态成员的特殊处理 静态成员具有全局特性,需注意: - **声明方式**:类内用`static`声明 - **定义要求**:必须在类外单独定义(分配存储空间) ```cpp class B { public: static A a; // 仅声明 }; A B::a; // 必须定义(此时调用A的构造函数)[^2][^5] ``` 若不进行类外定义,静态成员无法使用且可能导致链接错误 #### 4. 匿名类对象 特殊情况下可直接定义无类名的对象(较少使用): ```cpp class { // 无类名 public: int value; } obj1, obj2; // 直接定义对象[^4] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值