===============================================
转载时请表明出处:http://www.cofftech.com/thread-1389-1-1.html
===============================================
面向对象的方法以对象为中心和出发点。对象可以是某一类概念实体的实例,也可以是现实生活中的一个物理实体。
在上一节的类class integ的定义中,数据成员int j(一般情况下一个类可有多个数据成员)可以具有不同数值或不同数值的组合,可以使用各种成员函数对它进行不同操作。这种情况下,只用一个类来表达是不够的。应该为该类建立不同对象来加以表达;正如对于整型数据需要建立不同整型变量那样。例如:
int j, k, m;
其中j、k和m是不同整型变量,它们是整型数据类型int的不同实例;而
integ obj1, obj2, obj3; 中的obj1、obj2和obj3则是class integ的不同对象,它们是class integ的不同实例,它们的数据成员具有不同数值组合。
此处,类是一种用户自定义的数据类型,而对象是一个类的实例。正如j、k和m是整型类(int)数据的实例一样。
建立对象的过程是类实例化(instantiation of classes)的过程。
建立对象有两种方法:
1. 定义类的同时建立对象:
class integ {
int j;
public:
integ( ) { j = 6; } //构造函数
int sq();
int read();
} obj;
此处在定义class integ的同时也建立对象obj。
此法的缺点是所建立的对象是全局对象,从软件工程的观点看是不合适的。因此以下法为宜。
2. 常用的方法:先定义类然后再建立对象:
例如在主函数外定义或说明一个类,然后在主函数内建立对象,即:
void main( )
{
integ obj;
……
}
“封装性”的[例1]中对象obj被如下使用:
void main()
{
integ obj; //建立对象并初始化
cout << obj.read() << endl; //读数据
cout << obj.sq( ) << endl; //读平方值
}
/* Results:
6
36 */
其中分别读对象obj的数据成员j值以及求j的平方值。
从主函数可以看出,调用对象成员时,使用成员访问符(access operator)“ . ”。此处obj.read()和obj.integ::read( )的表达式是相同的。
对象可具有名称、指针和引用。在访问对象成员时可使用不同成员访问符。见下例。
[例1]分别使用对象的名称和指针来使用(访问)对象成员的例子
// access operators(成员访问符) . and ->
#include <iostream.h>
class Count {
public:
int x;
void print() { cout << x << endl; }
};
void main()
{
Count obj, // create obj object
*objPtr = &obj, // pointer to obj
&objRef = obj; // reference to obj
//使用对象名//
obj.x = 7; // assign 7 to data member x
cout << "Display x using the object's name: ";
obj.print(); // call member function print
//使用引用//
objRef.x = 8; // assign 8 to data member x
cout << "Display x using a reference: ";
objRef.print();
//使用指针//
objPtr->x = 10; // assign 10 to data member x
cout << "Display x using a pointer: ";
objPtr->print();
//请注意:对象的指针可直接指向对象的成员
}
/* Results:
Display x using the object's name: 7
Display x using a reference: 8
Display x using a pointer: 10
*/
对象的内存数据存储空间分为两部分:即内存栈区空间以及内存数据区空间。统称为“双区存储空间”。
一个对象被建立后,绝大多数情况下被存储于内存栈区空间内。(个别情况下,如整个对象是静态的,则它被存储于内存数据区空间内)。在该内存栈区空间内存储的是该对象的非静态数据。而该类的(供所有对象所共享)静态数据则存储于内存数据区空间内。
[例2]确定对象大小和各种变量的地址
#include "iostream.h"
class base {
public:
int x1;
static double s;
int inc( ) { return x1++; }
// To show that inc( ) does not occupy space in stack area
};
double base::s = 1.1; //类的静态数据必须说明或定义
void main()
{
// To show an object only contains non-static datum
cout<< "size of class base is "<< sizeof(base) << endl;
cout<< "equal to size of an integer:"<< sizeof(int) << endl;
//To show that static datum occupies space in data area
cout<< "address of static base::s is "<< &base::s <<endl;
// To show only non-static datum occupies space in stack area
base p;
cout<< "address of object p is "<< &p <<endl;
cout<< "address of p.x1 is "<< &p.x1 <<endl;
}
/* Results:
size of class base is 4
equal to size of an integer:4(函数和静态数据都不在本对象内)
address of static base::s is 0x00429098(在数据区内)
address of object p is 0x0012FF7C(在栈区内)
address of p.x1 is 0x0012FF7C(在栈区的同一地址内)
*/
C++语言中对象的具体定义:
类是包含数据(属性,Attributes)和对这些数据进行操作的函数(实现,Implementation)这两部分的实体(entity)。类的实例(instance)是对象(object)。
前面提到过,一个对象被建立后,至少被存储于两个内存存储空间内。其中内存栈区空间用于存储每个对象的非静态数据;内存代码空间(代码区)用于存储类的成员函数的代码。
如果对象中包括静态数据,则它被存放在内存数据区空间内。
如果类中包括虚函数,则内存栈区空间内还存放该对象的虚指针,内存数据区空间内还存放该对象的虚地址表。
上面[例2]中的程序obj_cont_1.cpp所确定的对象大小(长度)是该具体对象的内存栈区空间的长度而不包括其它内存空间。
对象的长度一般是其最长数据成员长度的整数倍。如果对象是空的,则系统为它分配一个字节的空间。
转载时请表明出处:http://www.cofftech.com/thread-1389-1-1.html
===============================================
面向对象的方法以对象为中心和出发点。对象可以是某一类概念实体的实例,也可以是现实生活中的一个物理实体。
在上一节的类class integ的定义中,数据成员int j(一般情况下一个类可有多个数据成员)可以具有不同数值或不同数值的组合,可以使用各种成员函数对它进行不同操作。这种情况下,只用一个类来表达是不够的。应该为该类建立不同对象来加以表达;正如对于整型数据需要建立不同整型变量那样。例如:
int j, k, m;
其中j、k和m是不同整型变量,它们是整型数据类型int的不同实例;而
integ obj1, obj2, obj3; 中的obj1、obj2和obj3则是class integ的不同对象,它们是class integ的不同实例,它们的数据成员具有不同数值组合。
此处,类是一种用户自定义的数据类型,而对象是一个类的实例。正如j、k和m是整型类(int)数据的实例一样。
建立对象的过程是类实例化(instantiation of classes)的过程。
建立对象有两种方法:
1. 定义类的同时建立对象:
class integ {
int j;
public:
integ( ) { j = 6; } //构造函数
int sq();
int read();
} obj;
此处在定义class integ的同时也建立对象obj。
此法的缺点是所建立的对象是全局对象,从软件工程的观点看是不合适的。因此以下法为宜。
2. 常用的方法:先定义类然后再建立对象:
例如在主函数外定义或说明一个类,然后在主函数内建立对象,即:
void main( )
{
integ obj;
……
}
“封装性”的[例1]中对象obj被如下使用:
void main()
{
integ obj; //建立对象并初始化
cout << obj.read() << endl; //读数据
cout << obj.sq( ) << endl; //读平方值
}
/* Results:
6
36 */
其中分别读对象obj的数据成员j值以及求j的平方值。
从主函数可以看出,调用对象成员时,使用成员访问符(access operator)“ . ”。此处obj.read()和obj.integ::read( )的表达式是相同的。
对象可具有名称、指针和引用。在访问对象成员时可使用不同成员访问符。见下例。
[例1]分别使用对象的名称和指针来使用(访问)对象成员的例子
// access operators(成员访问符) . and ->
#include <iostream.h>
class Count {
public:
int x;
void print() { cout << x << endl; }
};
void main()
{
Count obj, // create obj object
*objPtr = &obj, // pointer to obj
&objRef = obj; // reference to obj
//使用对象名//
obj.x = 7; // assign 7 to data member x
cout << "Display x using the object's name: ";
obj.print(); // call member function print
//使用引用//
objRef.x = 8; // assign 8 to data member x
cout << "Display x using a reference: ";
objRef.print();
//使用指针//
objPtr->x = 10; // assign 10 to data member x
cout << "Display x using a pointer: ";
objPtr->print();
//请注意:对象的指针可直接指向对象的成员
}
/* Results:
Display x using the object's name: 7
Display x using a reference: 8
Display x using a pointer: 10
*/
对象的内存数据存储空间分为两部分:即内存栈区空间以及内存数据区空间。统称为“双区存储空间”。
一个对象被建立后,绝大多数情况下被存储于内存栈区空间内。(个别情况下,如整个对象是静态的,则它被存储于内存数据区空间内)。在该内存栈区空间内存储的是该对象的非静态数据。而该类的(供所有对象所共享)静态数据则存储于内存数据区空间内。
[例2]确定对象大小和各种变量的地址
#include "iostream.h"
class base {
public:
int x1;
static double s;
int inc( ) { return x1++; }
// To show that inc( ) does not occupy space in stack area
};
double base::s = 1.1; //类的静态数据必须说明或定义
void main()
{
// To show an object only contains non-static datum
cout<< "size of class base is "<< sizeof(base) << endl;
cout<< "equal to size of an integer:"<< sizeof(int) << endl;
//To show that static datum occupies space in data area
cout<< "address of static base::s is "<< &base::s <<endl;
// To show only non-static datum occupies space in stack area
base p;
cout<< "address of object p is "<< &p <<endl;
cout<< "address of p.x1 is "<< &p.x1 <<endl;
}
/* Results:
size of class base is 4
equal to size of an integer:4(函数和静态数据都不在本对象内)
address of static base::s is 0x00429098(在数据区内)
address of object p is 0x0012FF7C(在栈区内)
address of p.x1 is 0x0012FF7C(在栈区的同一地址内)
*/
C++语言中对象的具体定义:
类是包含数据(属性,Attributes)和对这些数据进行操作的函数(实现,Implementation)这两部分的实体(entity)。类的实例(instance)是对象(object)。
前面提到过,一个对象被建立后,至少被存储于两个内存存储空间内。其中内存栈区空间用于存储每个对象的非静态数据;内存代码空间(代码区)用于存储类的成员函数的代码。
如果对象中包括静态数据,则它被存放在内存数据区空间内。
如果类中包括虚函数,则内存栈区空间内还存放该对象的虚指针,内存数据区空间内还存放该对象的虚地址表。
上面[例2]中的程序obj_cont_1.cpp所确定的对象大小(长度)是该具体对象的内存栈区空间的长度而不包括其它内存空间。
对象的长度一般是其最长数据成员长度的整数倍。如果对象是空的,则系统为它分配一个字节的空间。
发表评论
-
C++主流预处理,编译和链接过程
2011-09-11 13:26 10559在C++的程序的编写过程 ... -
c++ 一个简单的链表
2011-09-11 13:13 99181 #include <stdio.h> 2 # ... -
【2011.8.2】<C++学习笔记>预处理功能
2011-08-03 12:18 1451预处理功能介绍 ... -
C++经典电子资料下载合集
2011-07-11 11:43 35391.C++ 逆向工程 pdf高清下 ... -
《C++学习笔记》静态数据成员
2011-05-20 13:15 1089=============================== ... -
《C++学习笔记》不同数据类型对象的构造函数和析构函数的调用顺序
2011-05-19 01:34 1315=============================== ... -
《C++学习笔记》子对象构造函数和析构函数的调用顺序
2011-05-19 01:34 1478=============================== ... -
《C++学习笔记》子对象的初始化
2011-05-19 01:33 1686=============================== ... -
《C++学习笔记》特定类型数据成员的初始化
2011-05-17 10:56 1255========== ... -
《C++学习笔记》析构函数(destructor)
2011-05-17 10:55 1109=============================== ... -
《C++学习笔记》对象间非静态数据成员的复制
2011-05-16 12:04 958=============================== ... -
《C++学习笔记》带缺省参数的构造函数(constructor with default arguments)
2011-05-16 12:03 2634=============================== ... -
《C++学习笔记》构造函数及特点
2011-05-16 12:02 1271========== ... -
《C++学习笔记》【封装性】类的接口部分与实现部分的分离
2011-05-16 11:41 1593========== ... -
《C++学习笔记》【封装性】成员函数的说明和定义
2011-05-16 11:37 905成员函数可在类体之内、也可在类体之外被定义。规范的做法是将成员 ... -
《C++学习笔记》【封装】封装性
2011-05-16 11:35 675以下程序依靠封装,能 ...
相关推荐
c++学习笔记/知识要点精华版
C++ 学习笔记C++ 学习笔记C++ 学习笔记C++ 学习笔记
c++学习笔记.pdf
C++学习笔记C++学习笔记C++学习笔记C++学习笔记C++学习笔记
C++学习笔记
内容是C++面对对象的,目录大致来源于菜鸟文档的C++面向对象,笔记是参考各种文章以及菜鸟文档改编的,内容包含C++类和对象(类定义和对象定义,类成员函数,类访问修饰符,友元函数,内联函数,this指针,静态成员...
C++学习笔记.docx
c++完美学习笔记c++完美学习笔记c++完美学习笔记c++完美学习笔记
【C++学习笔记】一份详细的学习笔记,让你轻松掌握C++编程!
C++学习笔记: 以学习、思考、记录、分享为乐。
C++ 学习笔记C++ 学习笔记C++ 学习笔记C++ 学习笔记002
C++学习笔记
涉及各种情况下C++对象的sizeof大小,包括单一类对象,继承,重复继承 多继承 单一虚继承 等各种情况下的对象大小。对C++对象内存布局有清楚了解。
C++基础的学习笔记(其中的代码源件可私信留言) C++中的空头程序 使用C++书写hello world 学习变量 学习常量 标识符命名规则 数据类型 运算符 程序流程结构 数组 函数 指针 结构体
C++ 学习笔记C++ 学习笔记C++ 学习笔记C++ 学习笔记C++ 学习笔记003
C++ 学习笔记C++ 学习笔记C++ 学习笔记C++ 学习笔记C++ 学习笔记004
C++ 学习笔记C++ 学习笔记C++ 学习笔记C++ 学习笔记001
Visual C++学习笔记,切身学习体会和总结
C++学习笔记经典(与C比较),是学习C++的好资料。