C语言的类和对象
【类实现了C++面向对象程序设计的基础,我们使用类来定义对象的属性,类是
C++封装的基本单元。】
一、----- 类
使用关键字class创建类,一个类声明定义了一个连接代码和一个数据的新类型,这个新的类型又可以用来声明该类的对象。因此,类又是逻辑逻辑抽象概念,儿对象是物理存在的,也就是说对象是类的实例。
类的声明语法上和结构相似。
[一下是完整的类的形式]
class class_name
{
private data and functions
access_specifier:
data and functions
access_specifiter:
data and functions
//……..
access_specifier:是
data and functions
}object_list;
其中,object_list是任选项,如过存在,他声明类的对象。access_specifier为下面的三个关键字之一:
Public private protected
默认时,在类声明的函数和数据属于该类私有,只能被该类的成员访问。如果使用,pubilc访问限定符号,函数和程序就可以被其他部分访问。Protected访问限定符,仅在涉及继承的时候才需要(十五章了解)。访问限定符已经使用,其作用就保持到遇到别的访问限定符或者达到类声明的结束处。
在类声明内可以任意改变访问说明符号,对于某些声明,可以转换位public,然后再转换成private。
[如下所述]
/*******************************
··构造函数和析构函数学习···
*******************************/
//Using a constructor and destructor.
/*******************************
声明C++ 程序头文件
*******************************/
#include
#include
#include
#include
/*******************************
·名字空间:组织大型的程序结构·
*******************************/
using namespace std;
/*******************************
·····全局变量声明·····
/******************************/
#define SIZE 1024
/******************************* ················
/******************************/
class employee
{
char name[SIZE]; //private by deaulte public:
void putname(char *n);
void getname(char *n);
private:
double wage; //now,private again public:
void putwage(double w); //back to public
double getwage();
};
void employee::putname(char *n)
{
strcpy(name,n);
}
void employee::getname(char *n)
{
strcpy(name,n);
}
void employee::putwage(double w)
{
wage = w;
}
double employee::getwage()
{
return wage;
}
int main()
{
employee ted;
char my_name[1024] = "\0";
ted.putname("Yigao Wu\n");
ted.putwage(12000);
ted.getname(my_name);
cout << my_name << "makes $\n\n";
cout << ted.getwage() << "per year.\n";
cout << employee.wage << "per year.\n";
system("pause"); /*程序的停止按键提示*/ return 0;
}
【类内频繁使用访问限定符唯一优点是:通过把一个类各个部分可视的组织在一起,
可以使阅读程序者很好的阅读和理解,对于编译器没有什么区别。在类中声明的函数称之
为成员函数。成员函数可以访问类的所属的所有的任何成员(也称为实例变量),类的任
何元素都可被当做该类的成员。】
对于成员也有一些限制,非静态成员变量没有初值,成员不能成为当前正被声明声明
的类的对象(虽然一个成员可以是指向当前正被声明的类的指针)。成员不能声明为auto、extern或register。
可以使一个类的所有数据成员为该类私有,这是实现封装方法的一部分,然而有时候
也需要一个或者是几个为公有的(例如:为了获取较快的执行速度,频繁使用的变量是全
局可访问的)。一旦一个变量变成了公有的,在用户程序的所有的地方都可以访问这个变量,访问公有的数据的成员的语法与调用成员函数的语法是一样“:”指定对象名称,点运
算符和变量名称。
/*******************************
声明C++ 程序头文件
*******************************/
#include
/*******************************
·名字空间:组织大型的程序结构·
*******************************/
using namespace std;
/*******************************
·····
*******************************/
class employee
{
public:
int i,j,n,m;
};
int main()
{
employee em_one,em_two;
em_one.i = 1;
em_two.i = 2;
em_one.j = 3;
em_two.j = 4;
cout << "调试函数\n";
cout << em_one.i << "\n";
cout << em_two.i << "\n";
cout << em_one.j << "\n";
cout << em_two.j << "\n";
system("pause"); /*程序的停止按键提示*/
return 0;
}
一、----- 结构和类之间的关联
结构是C子集的一部分,是从C语言中继承过来的。在C++中结构的作用被扩展了,是它称为一个类的代替方法。类和结构的唯一区别在于:默认时,结构的所有成员是公有的,儿类的所有成员是私有的,除此之外结构和类是等价的。也就是说结构定义了一个类的类型。
/*******************************
···结构体和类的相互关系···
*******************************/
//Using a constructor and destructor.
/*******************************
声明C++ 程序头文件
*******************************/
#include
#include
#include
#include
/*******************************
·名字空间:组织大型的程序结构·
*******************************/
using namespace std;
/*******************************
·····全局变量声明·····
/******************************/
#define SIZE 1024
/*******************************
················
*******************************/
struct mystr
{
void buildstr(char *s); //public
void showstr();
private: //now go private
char str[255];
};
/*******************************/
void mystr::buildstr(char *s)
{
if(!*s) *str = '\0'; //initalize string
else strcat(str,s);
strcat(str,"Yigao Wu\n");
}
/*******************************/
void mystr::showstr()
{
cout << str << "\n";
}
/*******************************
················
/******************************/
int main()
{
mystr s;
s.buildstr(""); /*init*/
s.buildstr("Hello ");
s.buildstr("there!");
s.showstr();
system("pause"); /*程序的停止按键提示*/ return 0;
}
/*******************************
···类myter可做如下修改···
/******************************/
/*******************************
class mystr{
char str[255];
pubilc:
void buildstr(char *s); //public
void showstr();
}
******************************/
>>>有时候我们使用缩写POD来描述C风格的结构体――-不包含成员函数、构造函数和析构函数。POD表示Plain Old Data(及普通老数据)。
【结构和类的总结】
1、增强了结构能力;
2、增强了其移植性;
3、类定义可自由演化,结构体必受限于C的语言的定义;
二、----- 联合和类之间的关联
和结构体一样,联合(union)也可以用来定义类,在C++中联合既包括成员函数,也包含变量,还可以包含构造函数和析构函数。C++的连克包含了C联合的所有的特性,
其最重要的是数据元素共享内存的相同地址。与结构相似,默认时,联合成员都是公共的,并且完善与C兼容。
<下面使用联合交换组成一个无符号的短整型的字节>
/*******************************
声明C++ 程序头文件
*******************************/
#include
/*******************************
·名字空间:组织大型的程序结构·
*******************************/
using namespace std;
/*******************************
····联合体使用举例·····
*******************************/
union swap_byte
{
void swap();
void set_byte(unsigned short i);
void show_word();
unsigned short u;
unsigned char c[2];
};
void swap_byte::swap()
{
unsigned char t;
t = c[0];
c[0] = c[1];
c[1] = t;
}
void swap_byte::show_word()
{
cout << u << "\n";
}
void swap_byte::set_byte(unsigned short i)
{
u = i;
}
int main()
{
swap_byte b;
b.set_byte(1);
b.swap();
b.show_word();
system("pause");
return 0;
}
【与结构体一样,C++中的联合声明定义了一种特殊的类。保持了封装原则。】【与结构一样,术语POD一般也适用于不包含成员函数、构造函数和析构函数的联合。】使用C++联合时遵守以下限制条件:
1、联合不能继承任何其他类型的类;
2、联合不能是类,不能含有虚成员函数;
3、静态变量不能是联合的成员,不能使用引用的成员;
4、不能有任何成员的重载,“=”运算符的对象;
5、如果一个重载有明确的构造函数和析构函数,不能成为联合的成员。
三、----- 匿名联合
C++中有一种特殊的联合,成为匿名联合(anonymous)。匿名联合没有类型名称,也不声明这类联合的任何变量。但是匿名联合告诉编译器它的成员变量共享同一内存地址。然而,变量的本身可以直接被引用,无需常规的点运算符语法,
/*******************************
声明C++ 程序头文件
*******************************/
#include
/*******************************
·名字空间:组织大型的程序结构·
*******************************/
using namespace std;
int main()
{
//define anonymous union
union
{
long l;
double d;
char arry[32];
};
//now,reference union elements directly.
l = 10000;
cout << l << " \n";
d = 123.2342;
cout << d << " \n";
strcpy(arry,"Yigao Wu");
cout << arry << "\n";
cout << l << " \n";
system("pause");
return 0;
}
【联合元素的引用和一般局部变量的引用没有什么两样,事实上和程序有关,这完全取决于如何使用它们。】
它们是在联合中声明定义的,其作用域和其他任何位于同一块的的局部变量是相同的。这就意味着匿名联合成员的名称不应该和该联合域的其他标示符发生冲突。
联合和匿名联合都受以下限制:
1、匿名联合包含的元素只能是数据,不允许包含成员函数,同时不能包含私
有或保护元素;
2、全局匿名联合必须被声明为静态。
四、----- 友元函数
准许非成员函数通过友元(friend)访问类的私有成员是有可能的。友元函数可以访问类的私有成员和保护成员。要在类中声明一个友元函数,在类中的包含他的原型。只需要在前面放上关键词friend。
如下程序:
class Point
{
public:
Point(double xx, double yy) { x=xx; y=yy; }
void Getxy();
friend double Distance(Point &a, Point &b);
private:
double x, y;
};
友元函数的作用:
1、对于重载某些运算符有好处;
2、友元函数使得构造某些类型的I/O函数更加容易;
3、两个或者是两个以上的类包含与程序其他部分有关的想回关联的成员时,
可以使用友元函数;
【第三类友元的用法s实例】
/*******************************
声明C++ 程序头文件
*******************************/
#include
/*******************************
·名字空间:组织大型的程序结构·
*******************************/
using namespace std;
const int IDLE = 0;
const int INUSE = 1;
class C2;
class C1
{
int status; /*IDLE is off,INUSE if on screen*/ public:
void set_status(int state);;
friend int idle(C1 a,C1 b);
};
class C2
{
int status; /*IDLE is off,INUSE if on screen*/ public:
void set_status(int state);;
friend int idle(C1 a,C1 b);
};
void C1::set_status(int state)
{
status = state;
}
void C2::set_status(int state)
{
status = state;
}
int idle(C1 a,C2 b)
{
if(a.set_status || b.set_status)return 0;
else return 1;
}
/*******************************
·····友元函数学习·····
*******************************/
int mian()
{
C1 x;
C2 y;
x.set_status(IDLE);
y.set_status(IDLE);
if(idle(x,y)) cout << "Screen can be used.\n";
else cout << "In use.\n";
x.set_status(INUSE);
if(idle(x,y)) cout << "Screen can be used.\n";
else cout << "In use.\n";
system("pause");
return 0;
}
四、----- 友元类
一个类可以使另一个类的友元。此时,友元类和他所有成员函数可以访问其他类
定义的私有成员。(例如一下实例)
/*******************************
声明C++ 程序头文件
*******************************/
#include
/*******************************
·名字空间:组织大型的程序结构·
*******************************/
using namespace std;
/*******************************
···Using a friend class。··
*******************************/
class TwoValues
{
int a;
int b;
public:
TwoValues(int i,int j){a=i,b=j;}
friend class Min;
};
class Min
{
public:
int Text_function(TwoValues x);
};
#if 1
int Min::Text_function(TwoValues x)
{
return x.a < x.b ? x.a : x.b;
}
#endif
/*******************************
······友元类学习·····
*******************************/
int main()
{
TwoValues ob(10,20);
Min m;
cout << m.Text_function(ob) << "友元类的使用.\n";
system("pause");
return 0;
}