注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

snoopyxdy的博客

https://github.com/DoubleSpout

 
 
 

日志

 
 

C++笔记(二)  

2012-11-21 10:58:59|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
该笔记主要记录C++的类

1、用class声明类
在C++中对象的类型称为类(class)。类代表了某一批对象的共性和特征。类是对象的抽象,而对象是类的具体实例(instance)。类是抽象的,不占用内存,而对象是具体的,占用存储空间。在一开始时弄清对象和类的关系是十分重要的。

class Student //以class开头
{
int num;
char name[20];
char sex; //以上3行是数据成员
void display( ) //这是成员函数
{
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl; //以上4行是函数中的操作语句
}
};
Student stud1,stud2; //定义了两个Student类的对象stud1和stud2

以上代码简单的定义了一个Student的类,然后实例化了2个stud1和stud2的对象

2、private、public、protected

class 类名
{public:
公用的数据和成员函数;
private:
私有的数据和成员函数;
}

如果在类的定义中既不指定private,也不指定public,则系统就默认为是私有
protected(受保护的),用protected声明的成员称为受保护的成员,它不能被类外访问(这点与私有成员类似),但可以被派生类的成员函数访问。(后面会提到,有关类的继承)

3、在类外定义类成员

class Student
{ public:
inline void display(); //声明此成员函数为内置函数

private:

int num;
string name;
char sex;
};
inline void Student∷display()//在类外定义display函数为内置函数
{
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}

在类体中定义的成员函数的规模一般都很小,而系统调用函数的过程所花费的时间开销相对是比较大的。调用一个函数的时间开销远远大于小规模函数体中全部语句的执行时间。为了减少时间开销,如果在类体中定义的成员函数中不包括循环等控制结构,C++系统会自动将它们作为内置(inline)函数来处理。也就是说,在程序调用这些成员函数时,并不是真正地执行函数的调用过程(如保留返回地址等处理),而是把函数代码嵌入程序的调用点。这样可以大大减少调用成员函数的时间开销。

4、sizeof

class Time
{public:
int hour;
int minute;
int sec;
void set()
{
cin>>a>>b>>c;

}
};

cout<<sizeof(Time)<<endl;

输出的值是12。这就证明了一个对象所占的空间大小只取决于该对象中数据成员所占的空间,而与成员函数无关。函数代码是存储在对象空间之外的。如果对同一个类定义了10个对象,这些对象的成员函数对应的是同一个函数代码段,而不是10个不同的函数代码段。
虽然调用不同对象的成员函数时都是执行同一段函数代码,但是执行结果一般是不相同的。不同的对象使用的是同一个函数代码段,它怎么能够分别对不同对象中的数据进行操作呢?原来C++为此专门设立了一个名为this的指针,用来指向不同的对象。

5、指针访问对象

class Time
{public: //数据成员是公用的
int hour;
int minute;
};
Time t,*p; //定义对象t和指针变量p
p=&t; //使p指向对象t
cout<<p->hour; //输出p指向的对象中的成员hour

在p指向t的前提下,p->hour>,(*p).hour和t.hour三者等价。

Time t1; //定义对象t1
Time &t2=t1; //定义Time类引用变量t2,并使之初始化为t1
cout<<t2.hour; //输出对象t1中的成员hour

由于t2与t1共占同一段存储单元(即t2是t1的别名),因此t2.hour.就是t1.hour。

6、类外函数

void set_time(Time& t,int hour,int minute,int sec)
{
t.hour=hour;
t.minute=minute;
t.sec=sec;
}
void show_time(Time& t)
{
cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}

不提倡使用

7、构造函数

#include <iostream>
using namespace std;
class Time
{public:
Time() //定义构造成员函数,函数名与类名相同
{
hour=0; //利用构造函数对对象中的数据成员赋初值
minute=0;
sec=0;
}
void set_time( ); //函数声明
void show_time( ); //函数声明
private:
int
hour; //私有数据成员
int minute;
int sec;
};

在类外定义构造函数:

Time∷Time( ) //在类外定义构造成员函数,要加上类名Time和域限定符“∷”
{
hour=0;
minute=0;
sec=0;
}

有关构造函数的使用,有以下说明:
(1)在类对象进入其作用域时调用构造函数。
(2)构造函数没有返回值,因此也不需要在定义构造函数时声明类型,这是它和一般函数的一个重要 的不同之点。
(3)构造函数不需用户调用,也不能被用户调用。
(4)在构造函数的函数体中不仅可以对数据成员赋初值,而且可以包含其他语句。但是一般不提倡在构造函数中加入与初始化无关的内容,以保持程序的清晰。
(5)如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。
初始化值的构造函数

Box∷Box(int h,int w,int len):height(h),width(w),length(len){ }

在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类型不相同。这称为构造函数的重载。

class Box
{public:
Box( ); //声明一个无参的构造函数
Box(int h,int w,int len):height(h),width(w),length(len){ }//声明一个有参的构造函数,用参数的初始化表对数据成员初始化
int volume( );
private:
int height;
int width;
int length;
};
Box∷Box( ) //定义一个无参的构造函数
{
height=10;
width=10;
length=10;
}

尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。
也可以使用带默认参数的构造函数

Box(int h=10,int w=10,int len=10);


Box∷Box(int h,int w,int len) //在定义函数时可以不指定默认参数
{
height=h;
width=w;
length=len;
}


8、析构函数
析构函数(destructor)也是一个特殊的成员函数,它的作用与构造函数相反,它的名字是类名的前面加一个“~”符号。在C++中“~”是位取反运算符,从这点也可以想到:析构函数是与构造函数作用相反的函数。
当对象的生命期结束时,会自动执行析构函数。程序就会执行析构函数:
①如果在一个函数中定义了一个对象(它是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数。
②static 局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static
局部对象的析构函数。
③如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数)时,调用该全局对象的析构函数。
④如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数。

析构函数不返回任何值,没有函数类型,也没有函数参数。因此它不能被重载。一个类可以有多个构造函数,但只能有一个析构函数。

class Student //声明Student类
{
public:
student(int n,string nam,char s ) //定义构造函数
{
num=n;
name=nam;
sex=s;
cout<<"Constructor called."<<endl; //输出有关信息
}
~Student( ) //定义析构函数
{
cout<<"Destructor called."<<endl;} //输出有关信息
void display( ) //定义成员函数
{
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl<<endl;

}

private:

int num;
char name[10];
char sex;
};


int
main( )
{Student stud1(10010,"Wang_li",'f'); //建立对象stud1

stud1.display( ); //输出学生1的数据
Student stud2(10011,"Zhang_fun",'m'); //定义对象stud2
stud2.display( ); //输出学生2的数据
return 0;
}


9、指向对象成员函数的指针

void (Time∷*p2)( ); //定义p2为指向Time类中公用成员函数的指针变量

定义指向公用成员函数的指针变量的一般形式为
数据类型名 (类名∷*指针变量名)(参数表列);

p2=&Time∷get_time;

指针变量名=&类名∷成员函数名;
应用实例:

int main( )
{Time t1(10,13,56); //定义Time类对象t1
int *p1=&t1.hour; //定义指向整型数据的指针变量p1,并使p1指向t1.hour
cout<<*p1<<endl; //输出p1所指的数据成员t1.hour
t1.get_time( ); //调用对象t1的成员函数get_time
Time *p2=&t1; //定义指向Time类对象的指针变量p2,并使p2指向t1
p2->get_time( ); //调用p2所指向对象(即t1)的get_time函数
void (Time∷*p3)( ); //定义指向Time类公用成员函数的指针变量p3
p3=&Time∷get_time; //使p3指向Time类公用成员函数get_time
(t1.*p3)( ); //调用对象t1中p3所指的成员函数(即t1.get_time( ))
}


10、this指针
this指针是隐式使用的,它是作为参数被传递给成员函数的。

return(height*width*length); //隐含使用this
指针return(this->height*this->width*this->length); //显式使用this指针

注意,以上的*表示乘法







  评论这张
 
阅读(794)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016