类与对象(一)
时间:2010-11-16 来源:osullishuai80
一、类与对象概述
(1)在C++中的结构可以看作是用关键字struct创建的类.与C语言不同之处在于,其结构的成员不仅可以是变量,还可以是函数.
(2)C++中结构成员通常分为两种:
1.私有成员(private):它只能被该结构中的其它成员访问.
2.共有成员(public) :它既可以被结构中的其它成员访问,又可以被结构外的其它部分访问.
(3)类中的成员函数即使是在类中声明,类外定义,它也可以直接使用类内的私有化数据.
(4)类中成员从作用上讲,主要分为两种.一种是对象的属性,常设置为私有.另一种是对对象属性的操作,常设置为共有,且这些操作的接口函数多使用Getxxx()、Setxxx()等形式.
(5)C++源文件架构
1.头文件 :该文件用于类的声明及函数成员的声明.
2.xx.cpp :该文件用于定义类的成员,包括数据成员和函数成员.
3.main.cpp:在主函数中实例化一个对象,实现对数据成员和函数成员的调用.
Attention!!!
1.类的声明可以放在main.cpp内,但这样会带来一个问题,类的作用域只能是main()函数,当其它函数需要引用该类的成员时,编译器会报错.
2.声明类时系统不会在内存中分配地址空间,只有当实例化一个对象时才会在内存中分配地址空间,且空间大小等于类空间的大小. 二、类的定义
在C++中,将结构保留字struct换作class,即成为类的定义.
(1)类的声明中的private和public两个关键字可以按任意顺序出现任意次.为了使程序更加清晰,将所有私有成员和公有成员归类放在一起.
(2)类的关键字除了private和public外,还有protected(保护性成员).
(3)数据成员可以是任何数据类型,但不能用auto、register、extern声明.
(4)不能在类的声明中给数据成员进行初始化.
(5)类的例程:
class point
{
private:
int x;
int y;
public:
int num;
void print(void)
{
cout<<x<<' '<<y<<endl;
}
};
三、类的申明
(1)类中有两种成员,即数据成员和函数成员.
(2)定义函数成员有两种方法: 方法1:在类声明中只给出成员函数的原型,这种定义格式是将函数定义为非内联函数.其具体定义在类的外部.一般格式为: 返回类型 类名::函数名(参数列表)
{
//函数体
}
例程:
class point
{
private:
int x,y;
public:
void setpoint(int,int);
int getx();
};
int point::getx()
{
return x;
}
void point::setpoint(int a,int b)
{
x=a; y=b;
}
方法2:将函数成员定义为"内联函数".即将函数定义为内联函数有两种方法,一种是隐式定义,即在类中定义,默认为内联函数;另一种是在类外定义,必须加上关键字inline.
<1>隐式定义:直接书写在类中.
<2>显式定义:类中给出函数成员的声明,在类外定义时,冠以inline.
例程:
//隐式内联
class point
{
private:
int x,y;
public:
void setpoint(int,int)
{
x=a;
y=b;
} int getx()
{
return x;
} int gety()
{
return y;
}
};
//显式内联
class point
{
private:
int x,y;
public:
void setpoint(int,int);
int getx();
int gety();
};
inline void point::setpoint(int,int);
{
x=a;
y=b;
}
inline int point::getx()
{
return x;
}
inline int point::gety()
{
return y;
}
四、对象的定义及引用
(1)"类"是数据类型,"对象"是变量.
(2)当声明类的同时定义对象,则该对象是全局对象.当使用对象时再定义,则该对象是局部对象.注意,定义对象后,会为对象分配存储空间.这里,全局的对象在任何函数中均可以是偶那个,而局部对象只能在定义对象的函数中使用.
(3)无论是类中的数据成员,还是函数成员,只要是共有的,就可以被外部函数直接引用.引用的方法:
对象名.数据成员名
对象名.成员函数名(实参表)
例程:
class point
{
private:
int x,y;
public:
int num;
void setpoint(int i,int j);
int getx(){return x;}
int gety(){return y;}
}op1,op2; //定义全局对象
void point::setpoint(int i,int j) //类的函数成员
{
x = i; y = j;
}
void show_opint(void) //普通函数
{
cout<<"show op1 & op2 in fun!"<<endl;
cout<<"op1:"<<op1.num<<' '<<op1.getx()<<','<<op1.gety()<<endl;
cout<<"op2:"<<op2.num<<' '<<op2.getx()<<','<<op2.gety()<<endl;
}
void main()
{
point op3,op4; //定义局部对象
op1.num = 1; //成员引用
op2.num = 2;
op3.num = 3;
op4.num = 4;
op1.setpoint(10,15); //成员引用
op2.setpoint(20,25);
op3.setpoint(30,35);
op4.setpoint(40,45);
cout<<"show point in main!"<<endl;
cout<<"op1:"<<op1.num<<' '<<op1.getx()<<','<<op1.gety()<<endl;
cout<<"op2:"<<op2.num<<' '<<op2.getx()<<','<<op2.gety()<<endl;
cout<<"op3:"<<op3.num<<' '<<op3.getx()<<','<<op3.gety()<<endl;
cout<<"op4:"<<op4.num<<' '<<op4.getx()<<','<<op4.gety()<<endl;
show_opint(); //普通函数
}
Attention!!!
(1)op1.setpoint(1,2)等价于op1.point::setpoint(1,2).
(2)外部函数不能引用对象的私有成员.例如:
void main()
{
op3.x = 5; //错误
}
(3)在定义对象指针时,必须使用指针运算符"->"来访问对象成员.例如:
void main()
{
point a;
point *op = &a;
op->setpoint(1,2); //正确
op.setpoint(1,2); //错误
}
五、对象的赋值
(1)同一种类的对象可以相互赋值.例如:
#include <iostream.h>
class myclass
{
int a,b;
public:
void set(int i,int j){a=i;b=j;}
void show(){cout<<a<<','<<b<<endl;}
}; void main()
{
myclass p1,p2;
p1.set(20,5);
p2=p1; //对象赋值(将所有的成员逐个进行拷贝)
p1.show();
p2.show();
}
执行结果:
20,5
20,5
(2)将一个对象的值赋给另一个对象时,多数情况下都是可以的.但当类中存在指针时要特别小心,因为赋值结束后,两个对象内的成员指针都指向同一段地址空间,若其中一个对象改变了空间内的值,则另一个对象的成员指针所指向的内容也会发生变化.
六、类的作用域
(1)类的作用域就是在类声明中一对花括号所形成的作用域.
(2)一个类的任何成员可以引用该类的其它成员.
(3)一个类的成员函数可以不受限制的引用该类的数据成员,而在该类的作用域之外,对该类的数据成员和成员函数的引用则要受到一定的限制,只有公有成员才可以被外部函数引用,而对私有成员是不允许被外部函数引用的,这体现了类的封装性.
(1)在C++中的结构可以看作是用关键字struct创建的类.与C语言不同之处在于,其结构的成员不仅可以是变量,还可以是函数.
(2)C++中结构成员通常分为两种:
1.私有成员(private):它只能被该结构中的其它成员访问.
2.共有成员(public) :它既可以被结构中的其它成员访问,又可以被结构外的其它部分访问.
(3)类中的成员函数即使是在类中声明,类外定义,它也可以直接使用类内的私有化数据.
(4)类中成员从作用上讲,主要分为两种.一种是对象的属性,常设置为私有.另一种是对对象属性的操作,常设置为共有,且这些操作的接口函数多使用Getxxx()、Setxxx()等形式.
(5)C++源文件架构
1.头文件 :该文件用于类的声明及函数成员的声明.
2.xx.cpp :该文件用于定义类的成员,包括数据成员和函数成员.
3.main.cpp:在主函数中实例化一个对象,实现对数据成员和函数成员的调用.
Attention!!!
1.类的声明可以放在main.cpp内,但这样会带来一个问题,类的作用域只能是main()函数,当其它函数需要引用该类的成员时,编译器会报错.
2.声明类时系统不会在内存中分配地址空间,只有当实例化一个对象时才会在内存中分配地址空间,且空间大小等于类空间的大小. 二、类的定义
在C++中,将结构保留字struct换作class,即成为类的定义.
(1)类的声明中的private和public两个关键字可以按任意顺序出现任意次.为了使程序更加清晰,将所有私有成员和公有成员归类放在一起.
(2)类的关键字除了private和public外,还有protected(保护性成员).
(3)数据成员可以是任何数据类型,但不能用auto、register、extern声明.
(4)不能在类的声明中给数据成员进行初始化.
(5)类的例程:
class point
{
private:
int x;
int y;
public:
int num;
void print(void)
{
cout<<x<<' '<<y<<endl;
}
};
三、类的申明
(1)类中有两种成员,即数据成员和函数成员.
(2)定义函数成员有两种方法: 方法1:在类声明中只给出成员函数的原型,这种定义格式是将函数定义为非内联函数.其具体定义在类的外部.一般格式为: 返回类型 类名::函数名(参数列表)
{
//函数体
}
例程:
class point
{
private:
int x,y;
public:
void setpoint(int,int);
int getx();
};
int point::getx()
{
return x;
}
void point::setpoint(int a,int b)
{
x=a; y=b;
}
方法2:将函数成员定义为"内联函数".即将函数定义为内联函数有两种方法,一种是隐式定义,即在类中定义,默认为内联函数;另一种是在类外定义,必须加上关键字inline.
<1>隐式定义:直接书写在类中.
<2>显式定义:类中给出函数成员的声明,在类外定义时,冠以inline.
例程:
//隐式内联
class point
{
private:
int x,y;
public:
void setpoint(int,int)
{
x=a;
y=b;
} int getx()
{
return x;
} int gety()
{
return y;
}
};
//显式内联
class point
{
private:
int x,y;
public:
void setpoint(int,int);
int getx();
int gety();
};
inline void point::setpoint(int,int);
{
x=a;
y=b;
}
inline int point::getx()
{
return x;
}
inline int point::gety()
{
return y;
}
四、对象的定义及引用
(1)"类"是数据类型,"对象"是变量.
(2)当声明类的同时定义对象,则该对象是全局对象.当使用对象时再定义,则该对象是局部对象.注意,定义对象后,会为对象分配存储空间.这里,全局的对象在任何函数中均可以是偶那个,而局部对象只能在定义对象的函数中使用.
(3)无论是类中的数据成员,还是函数成员,只要是共有的,就可以被外部函数直接引用.引用的方法:
对象名.数据成员名
对象名.成员函数名(实参表)
例程:
class point
{
private:
int x,y;
public:
int num;
void setpoint(int i,int j);
int getx(){return x;}
int gety(){return y;}
}op1,op2; //定义全局对象
void point::setpoint(int i,int j) //类的函数成员
{
x = i; y = j;
}
void show_opint(void) //普通函数
{
cout<<"show op1 & op2 in fun!"<<endl;
cout<<"op1:"<<op1.num<<' '<<op1.getx()<<','<<op1.gety()<<endl;
cout<<"op2:"<<op2.num<<' '<<op2.getx()<<','<<op2.gety()<<endl;
}
void main()
{
point op3,op4; //定义局部对象
op1.num = 1; //成员引用
op2.num = 2;
op3.num = 3;
op4.num = 4;
op1.setpoint(10,15); //成员引用
op2.setpoint(20,25);
op3.setpoint(30,35);
op4.setpoint(40,45);
cout<<"show point in main!"<<endl;
cout<<"op1:"<<op1.num<<' '<<op1.getx()<<','<<op1.gety()<<endl;
cout<<"op2:"<<op2.num<<' '<<op2.getx()<<','<<op2.gety()<<endl;
cout<<"op3:"<<op3.num<<' '<<op3.getx()<<','<<op3.gety()<<endl;
cout<<"op4:"<<op4.num<<' '<<op4.getx()<<','<<op4.gety()<<endl;
show_opint(); //普通函数
}
Attention!!!
(1)op1.setpoint(1,2)等价于op1.point::setpoint(1,2).
(2)外部函数不能引用对象的私有成员.例如:
void main()
{
op3.x = 5; //错误
}
(3)在定义对象指针时,必须使用指针运算符"->"来访问对象成员.例如:
void main()
{
point a;
point *op = &a;
op->setpoint(1,2); //正确
op.setpoint(1,2); //错误
}
五、对象的赋值
(1)同一种类的对象可以相互赋值.例如:
#include <iostream.h>
class myclass
{
int a,b;
public:
void set(int i,int j){a=i;b=j;}
void show(){cout<<a<<','<<b<<endl;}
}; void main()
{
myclass p1,p2;
p1.set(20,5);
p2=p1; //对象赋值(将所有的成员逐个进行拷贝)
p1.show();
p2.show();
}
执行结果:
20,5
20,5
(2)将一个对象的值赋给另一个对象时,多数情况下都是可以的.但当类中存在指针时要特别小心,因为赋值结束后,两个对象内的成员指针都指向同一段地址空间,若其中一个对象改变了空间内的值,则另一个对象的成员指针所指向的内容也会发生变化.
六、类的作用域
(1)类的作用域就是在类声明中一对花括号所形成的作用域.
(2)一个类的任何成员可以引用该类的其它成员.
(3)一个类的成员函数可以不受限制的引用该类的数据成员,而在该类的作用域之外,对该类的数据成员和成员函数的引用则要受到一定的限制,只有公有成员才可以被外部函数引用,而对私有成员是不允许被外部函数引用的,这体现了类的封装性.
相关阅读 更多 +