zoukankan      html  css  js  c++  java
  • C++ Primer笔记3_默认实參_类初探_名字查找与类的作用域

    1.默认函数实參

    在C++中,能够为參数指定默认值,C语言是不支持默认參数的,Java也不支持!

    默认參数的语法与使用:
    (1)在函数声明或定义时,直接对參数赋值。这就是默认參数;
    (2)在函数调用时,省略部分或所有參数。这时能够用默认參数来取代。

    注意事项:

    (1)函数默认值仅仅能赋值一次,或者是在声明中。或者是在定义中,都能够。

    (2)默认參数定义的顺序为自右到左。即假设一个參数设定了缺省值时,其右边的參数都要有缺省值。比方int f(int a, int b=1,int c=2,int d=3)是对的,可是int f(int a,int b=1,int c=2,int d)就是错的。这个的原因非常显然。你传几个參数,编译器都觉得是从左向右的。比方int f(int a,int b=1,int c),传入了f(1,2),它会觉得a=1,b=2,那c呢?所以必须做这个限定。

    举例:

    #include <iostream>
    using namespace std;
    
    int fun(int &a);
    int fun(int *a, int b = 0);
    /*	error:
    int fun(int a = 0, int b)
    {
    	return b;
    }*/
    
    int fun(int *a = NULL, int b)
    {
    	cout << "b:" << b << endl;
    	return 10;
    }
    
    int fun(int a, int b = 0)
    {
    	return a;
    }
    
    int main()
    {
    	int *a = NULL;
    	cout << fun(10) << endl;
    	cout << fun(a, 20) << endl;
    
    	return 0;
    }

    2.类初探

    1)构造函数用来对类的数据成员进行初始化,析构函数用来释放已经实例化的对象。一个类除了须要定义一般的构造函数外,还要定义拷贝、赋值、析构三大函数;

    2)用public、private、protected来控制类成员的訪问权限。

    3)要訪问一个类的private成员,能够定义友元函数或友元类;

    4)假设类成员是const或引用类型,则必须在构造函数初始化列表进行初始化。成员函数后加const表示该成员函数不会改变调用此函数的对象。

    5)定义类时注意:一定最后别忘了加分号!

    否则会报错:new types may not be defined in a return type

    样例例如以下:

    class A
    {
          //......
    }
    
    int main()
    {
         return 0;
    }
    6)实例化对象时:

    Person p; //正确

    Person p();//p代表函数声明。试图把p当默认初始化的对象时会出错。

    7)多使用const引用。如用作函数參数,函数返回值,当其为大型对象时。免去了类的构造与析构。



    3.名字查找与类的作用域

    1)首先,在名字所在的块中找其声明语句,仅仅考虑在名字使用之前的声明

    2)假设没找到,继续查找外层作用域。

    3)假设终于没有找到匹配的声明,则程序报错。


    对于定义在类内部的成员函数来说。解析当中名字的方式与上述查找规则有差别。类的定义分两步处理:

    1)首先,编译成员的声明;

    2)直到类所有可见后才编译函数体。(编译器处理完类中的所有声明后才会处理成员函数的定义)


    样例:下面程序能够正常编译执行

    #include <iostream>
    
    using namespace std;
    
    typedef int AGE;
    
    class Person
    {
    public:
    	Person(){cout << "1 create" << endl;}
    	Person(AGE a, string n):age(a), name(n){cout << "2 create" << endl;}
    	~Person(){cout << "delete" << endl;}
    private:
    	AGE age;
    	string name;
    };
    
    int main()
    {
    	Person p(10, "SCOTT");
    	return 0;
    }
    上面的typedef int AGE;要在第一次使用AGE之前定义。假设定义在private的AGE age之前,会出错。


    一般来说。内层作用域能够又一次定义外层作用域中的名字。即使该名字已经在内存作用域中使用过。

    而在类中。假设成员使用了外层作用域中的某个名字,该名字代表一种类型。则类不能再之后又一次定义该名字

    例如以下的程序编译出错:

    #include <iostream>
    
    using namespace std;
    
    typedef int AGE;
    
    class Person
    {
    public:
    	Person(){cout << "1 create" << endl;}
    	Person(AGE a, string n):age(a), name(n){cout << "2 create" << endl;}
    	~Person(){cout << "delete" << endl;}
    private:
    	typedef double AGE;//ERROR
    	AGE age;
    	string name;
    };
    
    int main()
    {
    	Person p(10, "SCOTT");
    	return 0;
    }


    一道课后习题:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    class N
    {
    public:
    	N(int a){age = a;}
    	int getN()
    	{
    		return age;
    	}
    private:
    	int age;
    };
    
    class C
    {
    public:
    	C():n(30){}
    	void print()
    	{
    		cout << n.getN() << endl;
    	}
    private:
    	N n;
    };
    
    int main()
    {
    	C c;
    	c.print();
    
    	return 0;
    }




  • 相关阅读:
    DEDECMS里面DEDE函数解析
    dede数据库类使用方法 $dsql
    DEDE数据库语句 DEDESQL命令批量替换 SQL执行语句
    织梦DedeCms网站更换域名后文章图片路径批量修改
    DSP using MATLAB 示例 Example3.12
    DSP using MATLAB 示例 Example3.11
    DSP using MATLAB 示例 Example3.10
    DSP using MATLAB 示例Example3.9
    DSP using MATLAB 示例Example3.8
    DSP using MATLAB 示例Example3.7
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5401049.html
Copyright © 2011-2022 走看看