精华内容
下载资源
问答
  • foo正确的原型链如下图: <p><img alt="oop-2" src="https://raw.github.com/maxzhang/maxzhang.github.com/master/articles/images/oop-2.png" /></p> <p><strong>Note:</strong><strong>proto属性...
  • 第2章 面向过程编程风格 2.1 如何编写函数 函数定义: ...函数声明需要包含返回类型、函数名、参数列表,也称为函数原型。 2.2 调用函数 两种参数传递方式:传地址、传值 当我们调用一...

    第2章 面向过程的编程风格

    2.1 如何编写函数

    函数定义:

    每一个函数必须定义以下四个部分:

    1.返回类型。

    2.函数名

    3.参数列表

    4.函数体

     

    函数必须先声明,然后才能被调用。函数声明让编译器能检查函数的使用是否正确。

    函数声明:

    函数声明需要包含返回类型、函数名、参数列表,也称为函数原型。

     

    2.2 调用函数

    两种参数传递方式:传地址、传值

    当我们调用一个函数时,会在内存中建立一块特殊区域,称为程序堆栈。一旦函数完成,这块内存会被释放,里面的临时对象也会消失。

     

    通过传地址,可以将函数参数和实际对象产生关联。

    void swap(int &val1.int & val2) 

     

     

    作用域和地址:

    对象如果在函数以外声明,具有file scope,从声明点到文件末尾都可见,file scope内的对象具有static extent,从main()开始执行前内存就已经分配好了,一直持续到程序结束。

     

    动态内存管理

    分配动态内存使用new

    释放动态内存使用delete

    例子:

    int *pi = new int;

    int *pi  = new int(10);

     

    int*pia = new int[24]; //分配数组

    delete pi;   //删除pi所指的int

    delete [] pia;//删除数组

     

     

    2.3 提供默认参数值

    C++允许我们为函数参数提供默认值

    关于默认参数有两个规则:

    1.默认值的解析是从右开始的,如果我们为某个参数提供默认值,那么它右面的参数也要有默认值。

    2.默认值只能指定一次,可以在函数声明处,也可以在函数定义处。

    通常放在声明处。

     

    例子:

    //NumericSqe.h

    void display(const vector<int>&, ostream&=cout);

     

    #include”NumericSeq.h”

    void display(const vector<int>& vec, ostream &os)

    {

    }

     

     

    2.4 使用局部静态对象

    使用 局部静态对象:

     

    const vector<int>*

    fibon_seq(int size)

    {

     static vector<int> elems;

     

    return &elems;

    }

     

    elems被定义为函数中的局部静态对象。局部静态对象所处的内存空间。即使在不同的函数调用过程中,依然持续存在。

     

     

    2.5 声明inline函数

    将函数声明为inlien函数,表示要求编译器在函数调用点将函数内容展开。

    只要在函数前加上关键字 inline就可以将函数声明为inline:

    inline函数的定义一般在头文件中。

     

    比较短小的函数适合定义成inline函数。

     

    2.6提供重载函数

    参数列表不相同(参数类型或参数个数不同)的函数可以拥有相同的函数名称。

    如:

    void display(char ch);

    void display(const string&);

    调用时编译器通过参数列表知道该调用哪个函数。

     

    2.7 定义并使用模板函数

    函数模拟(function template)通过了一种机制,让我们得以将单一函数的内容与各种类型绑定(bind)起来。

    function template将参数列表的部分参数的类型抽离出来。

    function template以关键字template开场,然后是<>括起来的标识符,里面的标志符是我们希望推迟决定的数据类型。 用户利用这一模板来产生函数。

     

    template<typename elemType>

    void display(const string &msg, const vector<elemType>&vec)

    {

    cout<<msg;

    for(int ix = 0;ix <vec.size();++ix)

    {elemType  t = vec[ix];

     cout<<t<<’’l

    }

    }

    关键字typename表示,elemType在函数中是一个暂时放置类型的占位符。

    elemType可以是任意名称。

     

    使用function template的方式和普通函数相似:

    vector<int> ivec;

    string msg;

    //…

    display(msg,ivec);

    编译器会将elemType绑定为int,然后产生一份函数实例,

    如果写

    vector<string> ivec;

    string msg;

    //…

    display(msg,ivec);

    编译器会将elemType绑定为string.

     

    一般而言,如果函数具有多种实现方式,我们可以将它重载,

    如果我们希望函数主体不变,仅仅改变其中的数据类型,可以使用function template。

     

     

    2.8 函数指针带来更大的弹性

    函数指针(pointer to function),必须指明函数的返回值类型,参数列表。

    例如:

    const vector<int>* (*seq_ptr) (int);

     

    seq_ptr是一个可以 指向返回值是const vector<int>*,参数是int的函数 的函数指针。

    调用方式和函数相同:

    const vector<int>*pseq = seq_ptr(pos);

    取得函数的地址: 提供函数名即可:

    seq_ptr = pell_seq; //将pell_seq()的地址给seq_ptr指针。

     

    2.9 设定头文件

    函数的定义只有一份,但可以有多份声明。

    一个对象只能在程序中定义一次。

    inlien函数的定义放在头文件中。

     

    在file scope内定义的对象,如果可能被多个文件访问,就应该被声明在头文件中。

    在对象前定义前加关键字extern可以使其变成声明:

    extern const vector<int>* (*seq_array[seq_cnt])(int);

     

    const  object是一次定义规则下的例外,const object的定义只要一出文件之外就不可见。?

     

     

    展开全文
  • 可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 数组大小 1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数指定...
  • 线程创建与撤销

    2011-09-15 17:01:39
    它在调用进程的地址空间上创建一个线程,执行指定的函数,并返回新建立线程的句柄。 原型: HANDLE CreateThread(  LPSECURITY_ATTRIBUTES lpThreadAttributes,  DWORD dwStackSize,  LPTHREAD_START_ROUTINE ...
  • 可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 12  数组大小 13 1.23 能否声明和传入数组大小一致的局部数组,或者由...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 12  数组大小 13 1.23 能否声明和传入数组大小一致的局部数组,或者由...
  • 句,这里我们将其放到private 里,因为一般的函数都放在public 里,而变量 都放在private 里。 #ifndef WIDGET_H #define WIDGET_H #include #include "mydlg.h" //包含头文件 namespace Ui { class Widget; } ...
  • 1.派生类中重新定义了一个和基类中的原型完全相同的函数,这种情况不属于函数重载,属于重写 2.类中定义了两个同名、同参数表的函数,但其中一个是常成员函数,这种情况属于函数重载 第14题: 虚基类的正确声明为...

    第4题:

    理解函数重载的概念:

    以下为易混淆点

    1.派生类中重新定义了一个和基类中的原型完全相同的函数,这种情况不属于函数重载,属于重写

    2.类中定义了两个同名、同参数表的函数,但其中一个是常成员函数,这种情况属于函数重载

    第14题:

    虚基类的正确声明为:class B:virtual public A

    第15题:

    理解虚函数:

    虚函数既可以在函数说明时定义,也可以在函数实现时定义,这种说法错误

    第30题:

    定义派生类时,若不使用类关键字显式地规定采用何种继承方式,则默认方式为 私有  继承

    例子:

     

    #include <iostream.h>
    class Point {
    
    private:
    	int x,y;
    public:
    	Point(int a,int b){x = a;y = b;}
    	void show(){
    	
    	    cout << "x = " << x << ", y = " << y << endl;
    	}
    
    };
    class a: Point{
    private :
    	int H,W;
    public:
    	a(int a,int b,int h,int w):Point(a,b){
    	   H = h;
    	   W = w;
    	}
    	void show(){
    		Point::show();
    		cout << "H = " << H << ", W = " << W << endl;
    	}
    };
    class Test:public a{
      
    public:
    	Test(int a,int b,int h, int w):a(a,b,h,w){}
    	void show(){
    		a::show()
    		//Point::show();//error C2247: 'show' not accessible because 'a' uses 'private' to inherit from 'Point'
    	}
    };
    void main(){}

     

    第39题:

    重载的运算符保持其原有的运算符个数、优先级和结合性不变

    第49题:

    注意friend与static的区别和用法

    例子一:

     

     

    #include <iostream.h>
    #include <math.h>
    class dis{
    private:
    	double x,y;
    public:
    	dis(double x1,double y1){
    	  x = x1;
    	  y = y1;
    	}
    	double getx(){
    	   return x;
    	}
    	double gety(){
    	   return y;
    	}
    	friend double log(dis&,dis&);
    };
    double log(dis&a,dis&b){
       double px = a.x - b.x;
       double py = a.y - b.y;
       return sqrt(px*px + py*py);
    }
    void main(){
        dis p1(3.5,4.5),p2(5.5,6.5);
    	double d = log(p1,p2);
    	cout << "the distance is " << d;
    }
     
    例子二:
    #include <iostream.h>
    #include <math.h>
    class dis{
    private:
    	double x,y;
    public:
    	dis(double x1,double y1){
    	  x = x1;
    	  y = y1;
    	}
    	double getx(){
    	   return x;
    	}
    	double gety(){
    	   return y;
    	}
    	static double log(dis&,dis&);
    };
    double dis::log(dis&a,dis&b){
       double px = a.x - b.x;
       double py = a.y - b.y;
       return sqrt(px*px + py*py);
    }
    void main(){
        dis p1(3.5,4.5),p2(5.5,6.5);
    	double d = dis::log(p1,p2);
    	cout << "the distance is " << d;
    }
    
     
    第53题:
    有两个矩阵a和b,都是2行3列。求两个矩阵之和。重载运算符“+”,使之能用于矩阵相加。如c = a + b
    #include <iostream.h>
    class Mx {   
    private:
    	int m[2][3];
    public:
    	Mx();
    	friend Mx operator+ (Mx&,Mx&);
    	void input();
    	void show();
    };
    Mx::Mx(){
    	for(int i = 0; i < 2; i++ ) {
    		for(int j = 0 ; j < 3; j++ ){
    			m[i][j] = 0;
    		}
    	}
    }
    Mx operator+ (Mx& a, Mx& b){
    	Mx c;
    	for(int i = 0 ; i < 2 ; i++){
    		for(int j = 0 ; j < 3 ; j++){
    			c.m[i][j] = a.m[i][j]+b.m[i][j];
    		}
    	}
    	return c;
    }
    void Mx::input(){
    	cout << "输入矩阵的值:"
    		<< endl;
    	for(int i = 0 ; i < 2; i++){
    		for(int j = 0 ; j < 3 ; j++){
    			cin >> m[i][j];
    		}
    	}
    }
    void Mx::show(){
    	for(int i = 0 ; i < 2; i++){
    		for(int j = 0 ; j < 3; j++){
    			cout << m[i][j] << "  ";
    		}
    		cout << endl;
    	}
    }
    void main(){
    	Mx a,b,c;
    	a.input();
    	b.input();
    	cout << endl << "矩阵a:"
    		<< endl;
    	a.show();
    	cout << endl << "矩阵b:"
    		<< endl;
    	b.show();
    	c = a + b;
    	cout << endl << "矩阵c:"
    		<< endl;
    	c.show();
    }
     
    展开全文
  • 编译预处理

    2012-09-24 16:33:00
    1、预处理命令不是语言本身组成部分 2、宏展开不做正确性检查 ...1、文件包含可包含以下内容:符号常量定义、函数原型声明、结构体变量定义、全局变量定义、类型定义(typedef) 2、文件包含可以嵌套 3、

    1、预处理命令不是语言本身的组成部分

    2、宏展开不做正确性检查

    3、宏定义不是语句,不以“;”结束

    4、可以嵌套宏定义

    5、宏定义不会占据内存空间

    6、宏定义不作用于程序中双引号内的字符串

    7、使用undef可以提前终止宏定义的作用域

     

    1、文件包含可包含以下内容:符号常量定义、函数原型声明、结构体变量定义、全局变量定义、类型定义(typedef)

    2、文件包含可以嵌套

    3、若头文件放在其他目录下,可在双撇号中指出目录

    4、如果头文件包含静态全局变量,则其作用域将扩到到心文件中

     

    1、条件编译可以提高程序的通用性(通过对某一标示符进行不同的定义#define INTEGER 16)

    2、统一控制调试输出语句

    3、三种条件编译形式:

    (1)#ifdef 标示符

             程序段1

             #else

             程序段2

             #endif

    (2)#ifndef 标识符

             程序段1

             #else

            程序段2

            #endif

    (3)#if 表达式

              程序段1

             #else 

             程序段2

            #endif

     

    类型定义步骤:

    (1)先按定义变量的方法写出定义体(int i;)

    (2)将变量名换成新类型名(int INTEGER;)

    (3)在最前面加typedef(typedef int  INTEGER;)

    (4)使用新类型名去定义变量

     

     

     

     

    展开全文
  • 你必须知道495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    3, 有的为4, 哪个是正确的? . . . . . . . . . . . . . . . . . . . . . 14 3.4 这是个巧妙的表达式: a ˆ= b ˆ= a ˆ= b 它不需要临时变量就可 以交换a 和b 的值。. . . . . . . . . . . . . . . . . . . . . . ....
  • 警告:“function”未定义;...(2)原型非 extern 外部函数  自己在使用时,出现此警告,但是在VS2010中能找到其定义和声明的地方,根据上面 微软给出检查,但又没发现问题。神奇!  好吧,既然V

    警告:“function”未定义;假设外部返回 int


    错误原因:编译器遇到对未定义函数的调用。


    通过检查以下可能的原因进行修复

    (1)函数名称拼写不正确

    (2)原型非 extern 的外部函数


       自己在使用时,出现此警告,但是在VS2010中能找到其定义和声明的地方,根据上面 微软给出的检查,但又没发现问题。神奇

        好吧,既然VS能右键功能能够找到定义和声明,那我就在引用的地方看看,还真没发现,把头文件加入,OK警告不见了


    警告:微软的这个上面解释存在bug


    解决:添加函数的头文件

    展开全文
  • C++复习资料之系列

    2008-12-30 21:35:45
    1.以下正确的函数原型为( d )。 (a) f( int x; int y ); (b) void f( x, y ); (c) void f( int x, y ); (d) void f( int, int ); 2.有函数原型 void fun1( int ); 下面选项中,不正确的调用是( c )。 (a) ...
  • 答:函数如果使用在定义之前,可以不必进行原型声明 2:与k=n++完全等价表达式是(_)。 答:k=n, n=n+1 3:下列哪个不是有效字符常量(_)。 答:“a” 4:已有定义char_s1,s2[20];下面可以为所定义变量正确输入...
  • 不同编译器给出不同的结果, 有的为 3, 有的为 4, 哪个是正确的? o 4.4 这是个巧妙的表达式: a ^= b ^= a ^= b 它不需要临时变量就可以交换 a 和 b 的值。 o 4.5 我可否用括号来强制执行我所需要的计算顺序? o ...
  • php高级开发教程说明

    2008-11-27 11:39:22
    出重要的部分,然后把这些部分译成正确的代码。这个分析过程分两步执行:形式分析和逻辑 分析。首先通过检查文章的可视结构来执行形式分析,例如:检查段落、行、列甚至词之间的 空隙。这一过程打破了对文章的整体...
  • 数据结构(C++)有关练习题

    热门讨论 2008-01-02 11:27:18
    2、实现1所要求代码后,运行设计好代码,将以下的几组整数序列建成搜索二叉树,并记录下它们前序遍历序列和后序遍历序列: a. 1、3、5、7、9; b. 1、13、35、13、27; c. 50、25、78、13、44、...
  • C++MFC教程

    热门讨论 2013-05-21 13:37:15
    而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。 5、示例:下面有一段伪代码...
  • 使用基本函数的构造函数:Number(), String(), Boolean()等生成):</li></ul> <pre><code> javascript var n = 5; console.log(n.toString(2)); // 快速进制转换 </code></pre> <ul><li>对象...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    删除操作一旦执行,立即被监听器捕获到,进而在执行 删除操作前执行自定义的函数体,即判断实体有无undeletable标签,有则中断删除操作,无则正常删除。 用例图 关系 关联关系 ;依赖关系 ;泛化关系;关系的...
  • 如果声明的返回类型是double,而函数返回一个int表达式,则该int值将被强制转换为double类型 7.1.2 函数原型和函数调用 句法:函数原型不要求提供变量名,有类型列表就足够了,如: void test(int); 原型用变量名...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

以下正确的函数原型声明