zoukankan      html  css  js  c++  java
  • 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;;

  • 相关阅读:
    leetcode--Interleaving String
    SR4000自带软件修改(二)
    修改SR4000自带软件,支持opencv
    获取当前进程的寄存器内容
    sr4000自带API和opencv结合获取图像
    远程进程注入
    【转+心得】WinDbg+VM9双机调试无法连接解决方案
    boost库的使用(一)
    SR4K的API使用(libMesaSR.dll)
    java含多个包的命令行下执行
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300630.html
Copyright © 2011-2022 走看看