现在的位置: 首页 > 综合 > 正文

C++指针入门(二)

2013年03月06日 ⁄ 综合 ⁄ 共 1568字 ⁄ 字号 评论关闭

用函数指针变量调用函数

一个函数在编译时被分配一个入口地址,这个函数的入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用函数。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。

看程序:

int max(int x, int y) {

int z;

if(x > y)

z = x;

else

z=y;

return z;

}

void main() {

int (*p)(int, int);  //
定义指向函数的指针变量p

int a, b, m;

p = max;//
使
p指向函数max,此句不能省

cin>>a>>b;

m = p(a,b);

cout<<"max="<<m<<endl;

}

注意:(*p)两侧的括号不可省略,表示p先与*结合,它是指针变量,然后再与后面的()结合,表示此指针变量指向函数,这个函数值是整型的。 
只需将函数名
max赋给p,不能写成”p = max(a,b);”形式。函数名代表函数入口地址,而max(a,b)则是函数调用了。

指针函数

返回指针值的函数简称为指针函数

对象的初始化

在建立一个对象时,常常需要做某些初始化的工作,例如对数据成员赋初值。如果一个数据成员未被赋值,则它的值是不可预知的,因为在系统为它分配内存时,保留了这些存储单元的原状,这就成为了这些数据成员的初始值。与人们的要求不相符,值应该是确定的。类并不是一个实体,而是一种抽象类型,并不占存储空间,无处容纳数据。因此在声明类时初始化类的数据成员是错误的。

例:

class Time {

public:

Time() {

hour = 2;

minute = 3;

sec = 5;

}

void set_time();

void show_time();

private:

int hour;

int minute;

int sec;

};

void Time::set_time() {

cin>>hour;

cin>>minute;

cin>>sec;

}

void Time::show_time() {

cout<<hour<<":"<<minute<<":"<<sec<<endl;

}

void main() {

Time t1;

t1.show_time();

}

在建立对象时自动执行构造函数,它的作用是对该对象中的数据成员赋初值0

有关构造函数的说明:

(1) 什么时候调用构造函数:在类对象进入其作用域时调用构造函数。如,在函数fun1开头定义了一个对象a,则在执行fun1函数时,就要建立对象a,对象a就有了自己的作用域,或者说,对象a的生命周期开始了。

(2) 构造函数不需要用户调用,也不能被用户调用。下面用法是错误的。

t1.Time();

构造函数是在定义对象时由系统自动执行的,而且只执行一次。构造函数一般声明为public

(3) 在构造函数的函数体中不仅可以对数据成员赋值,而且可以包含其他语句,例如cout语句。但是一般不提倡在构造函数中加入与初始化无关的内容,以保持程序的清晰。

(4) 如果用户自己没有定义构造函数,则C++系统自动生产一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作,会对数据提供一个默认值。

(5) 带参数的构造函数中的形参,其对应的实参在定义对象时给定。Box box1(10, 20);

(6) 如果在建立对象时选用的是无参构造函数,应注意正确书写定义对象的语句。如:

Box box1; // 建立对象的正确形式

注意不要写成

Box box1();//
建立对象的错误形式,不应该有括号

对象有地址,存放对象初始地址的指针变量就是指向对象的指针变量。对象中的成员也有地址,存放对象成员地址的指针变量就是指向对象成员的指针变量

静态初始化对象指针

Time t, *p; // 定义对象t和指针变量p

p = &t;

cout<<p->hour<<endl;

动态初始化对象指针

Time *p;

P = new Time();

cout<<p->hour<<endl;;

抱歉!评论已关闭.