C++指针入门(二)
用函数指针变量调用函数
一个函数在编译时被分配一个入口地址,这个函数的入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用函数。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。
看程序:
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;;