精华内容
下载资源
问答
  • 非成员函数(只能重载)、构造函数(虚函数需要使用对象调用)、静态成员函数(属于类)、内联成员函数、友元函数这五种,下面分别解释为什么这五种函数不能被声明成虚函数。 1. 非成员函数  非成员函数只能被...

    在C++,有五种函数不能被声明成虚函数,分别是:

    非成员函数(只能重载)、构造函数(虚函数需要使用对象调用)、静态成员函数(属于类)、内联成员函数、友元函数这五种,下面分别解释为什么这五种函数不能被声明成虚函数。

    1. 非成员函数

     非成员函数只能被重载(overload),不能被继承(override),而虚函数主要的作用是在继承中实现动态多态,非成员函数早在编译期间就已经绑定函数了,无法实现动态多态,那声明成虚函数还有什么意义呢?

    2. 构造函数

     要想调用虚函数必须要通过“虚函数表”来进行的,但虚函数表是要在对象实例化之后才能够进行调用。而在构造函数运行期间,还没有为虚函数表分配空间,自然就没法调用虚函数了。

    3. 静态成员函数

     静态成员函数对于每个类来说只有一份,所有的对象都共享这一份代码,它是属于类的而不是属于对象。虚函数必须根据对象类型才能知道调用哪一个虚函数,故虚函数是一定要在对象的基础上才可以的,两者一个是与实例相关,一个是与类相关。

    4. 内联成员函数

     内联函数是为了在代码中直接展开,减少函数调用花费的代价,虚函数是为了在继承后对象能够准确的执行自己的动作,并且inline函数在编译时被展开,虚函数在运行时才能动态地绑定函数。

    5. 友元函数

     因为C++不支持友元函数的继承,对于没有继承特性的函数没有虚函数的说法。友元函数不属于类的成员函数,不能被继承

    展开全文
  • php构造函数是一种特殊的方法,主要用来创建对象...一个类只能声明一个构造函数,而是只有每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务。该方...

    php构造函数是一种特殊的方法,主要用来在创建对象时初始化对象; 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。

    c6550963abbc88d73ee5270eff050aab.png

    当使用 new 操作符创建一个类的实例时,构造函数(方法)将会自动调用,其名称必须是 __construct()。

    在一个类中只能声明一个构造函数,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务。该方法无返回值。

    语法:function __construct(arg1,arg2,...)

    {

    ......

    }

    demo:<?php

    /**

    * Created by PhpStorm.

    * User: liudandan

    * Date: 2018/5/13

    * Time: 11:50

    */

    class BaseClass {

    function __construct() {

    print "我是构造函数\n";

    }

    }

    class SubClass extends BaseClass {

    function __construct() {

    parent::__construct();

    print "我是 SubClass 下的构造函数\n";

    }

    }

    class OtherSubClass extends BaseClass {

    }

    $obj = new BaseClass();

    $obj = new SubClass();

    $obj = new OtherSubClass();

    b1a9b77283f4e058b4fd83a95e23bf50.png

    展开全文
  • 以下几种情况时必须使用初始化...3 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化。 针对上面3种情况,写代码测试结果如下: class CBase { pu

    以下几种情况时必须使用初始化列表:

    1 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面

    2 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面

    3 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化。


    针对上面3种情况,写代码测试结果如下:

    class CBase
    {
    public:
        CBase(int i, int j, int k, int &r):m_i(i), m_j(j), m_k(k), m_r(r)
        {
            //m_k = k; // error, compiler report that must be initialized in initializer list
            //m_r = r; // error, same reason as above
        };
    protected:
    private:
        int m_i;
        int m_j;
        const int m_k;  // const member
        int &m_r;       // reference member
    };
    
    class CSecond
    {
    public:
        CSecond(CBase base):m_base(base) // that is ok!
        {
            //m_base = base; // error, no appropriate default constructor available
        };
    private:
        CBase m_base;
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int nNum = 4;
        //CBase base; // error, if Class provide a construct with argument, 
                      // there have no default construct without argument 
        CBase base(1, 2, 3, nNum);
    
    	return 0;
    }
    

    参考文章:http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html

    展开全文
  • C++构造函数

    2018-07-26 12:02:35
    必须在构造函数初始化式里进行初始化的数据成员有哪些  (1) 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面  (2) 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始...

    必须在构造函数初始化式里进行初始化的数据成员有哪些 
    (1) 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 
    (2) 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面 
    (3) 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化

     

    C++中的构造函数可以分为4类: 
    (1)默认构造函数。以Student类为例,默认构造函数的原型为 
    Student();//没有参数 
    (2)初始化构造函数 
    Student(int num,int age);//有参数 
    (3)复制(拷贝)构造函数 
    Student(Student&);//形参是本类对象的引用 
    (4)转换构造函数 
    Student(int r) ;//形参时其他类型变量,且只有一个形参

    默认和初始化构造函数

    默认构造函数和初始化构造函数在定义类的对象的时候,完成对象的初始化工作。

    class Student
    {
    public:
        //默认构造函数
        Student()
        {
           num=1001;
           age=18;     
        }
        //初始化构造函数
        Student(int n,int a):num(n),age(a){}
    private:
        int num;
        int age;
    };
    int main()
    {
        //用默认构造函数初始化对象S1
        Student s1;
        //用初始化构造函数初始化对象S2
        Student s2(1002,18);
        return 0;
    }

    复制(拷贝)构造函数

    • 复制构造函数用于复制本类的对象
     Student  s2(1002,1008);
     Student  s3(s2);//将对象s2复制给s3。注意复制和赋值的概念不同。
    • 下面这种情况叫做赋值,不调用复制构造函数。
     Student s4;
     s4=s2;//这种情况叫做赋值,自己体会吧
    • 大多数时候,在类中我们没有声明复制构造函数,而是C++自动为我们生成了一个复制构造函数,如下:
     Student(Student &b)
        {
            this.x=b.x;
            this.y=b.y;
        }
    • 如代码所示,它的作用是将一个已存在的对象b,复制给调用该复制构造函数的对象。
    • 具体来说,在一下情况发生时,会调用复制构造函数: 
      1. 用复制的方法,建立一个新对象。
      2. 函数的形参为类的对象时。(这点和普通类型的形参类似,要复制一份实参给函数)
      3. 函数的返回值是类的对象,在函数中定义的对象,在函数结束后消失,需要调用复制构造函数,建立一个临时的对象,将该临时对象返回给调用该函数的对象。
      4. 默认的复制构造函数,在某些情况下会出现问题,想深入学习可以自行百度。

    转换构造函数

    转换构造函数的作用是将某种类型的数据转换为类的对象,当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数。

    复制代码

    class A
    {
    public:
        int a;
        A(int a) :a(a) {}
        A reta()
        {
            return a;
        }
    };
    int main()
    {
        A a(2);
        A b = a.reta();
        A c = 3;
        cout<<b.a<<"\n"<<c.a<<endl;
        return 0;
    }

    复制代码

     结果是输出2和3

    实际上这是由隐式转换机制造成的,如果不想要这种效果,可以在构造函数前加上explicit声明。加上之后上面的代码就会编译出错,提示

    无法从“int”转换为“A”。

    既然能将数据转换为类型,类型也能转换为数据。c++的类型转换函数可以将一个类的对象转换为一个指定类型的数据。

    类型转换函数的一般形式为 :

    operator 类型名()

    {实现转换的语句}

    测试代码:

     

    复制代码

    class A
    {
    public:
        int a;
        A(int a) :a(a) {}
        operator int()
        {
            return a;
        }
    };
    int main()
    {
        A a(2);
        int b = a + 3;
        A c = a + 4;
        cout<<b<<"\n"<<c.a<<endl;
        return 0;
    }

    复制代码

    结果输出5和6

    展开全文
  • C# 静态构造函数

    2016-09-14 15:22:00
    静态构造函数有哪些特点呢: 静态构造函数没有修饰符修饰(public,private),因为静态构造函数不是我们程序员调用的,是由CLR调用的, 静态构造函数没有参数,...静态构造函数中不能实例化实例变量。(变量可以分...
  • 静态构造函数是在构造函数方法前面添加了static关键字之后形成的,并且没有修饰符(public,private),没有参数。...2、静态构造函数没有参数,因为框架不可能知道我们需要在函数中添加什么参数,所以规定不能使用参数...
  • 构造函数与初始化列表 ...(即使自己没有在含参构造函数中都是基本数据类型, 强制显式使用初始化列表, 也会自动调用初始化列表, 而在构造函数内部执行的仅仅是赋值) 创建派生类对象时,程序首先调用基类构造函数,
  • 箭头函数哪些特性

    千次阅读 2019-07-15 21:25:21
    1不能作为构造函数不能使用new 2不能使用argumetns,取而代之用rest参数…解决 3不绑定this,会捕获其定义时所在的this指向作为自己的this。由于vue自动绑定 this 上下文到实例,因此不能使用箭头函数来定义...
  • 箭头函数和普通匿名函数有哪些不同? 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。...(不常用)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。 generator函数现在经...
  • 虚函数的定义虚函数的实现机制哪些函数不能被设置为虚函数?虚函数的访问指针访问引用访问对象访问成员函数中的访问构造函数和析构函数中访问纯虚函数抽象类虚析构函数重载、隐藏、覆盖虚拟继承虚拟继承时派生类对象...
  • Excel函数中,有那么的一个...附:Excel函数构造可能许多同学太了解函数的构造,一起来看看Excel函数在使用时有哪些规范,首先我们看一下标点符号的使用规范:函数里面的标点要使用英文输入法下的标点,Exc...
  • 干货预警,全文2288字,阅读需要6分钟,赶时间的同学点赞▲收藏★喜欢❤,一气呵成!Excel函数中,有那么的一个...附:Excel函数构造可能许多同学太了解函数的构造,一起来看看Excel函数在使用时有哪些规范,...
  • <Headfirst JAVA> 一、没有被声明为public的类,只能自已的包内被其他类...三、如果一个类只有私有的构造函数,它不能被继承 留待验证 转载于:https://www.cnblogs.com/zhengchunhao/p/4996027.html...
  • 访问修饰符 返回类型 泛型方法名 (T 参数)1):无法泛型方法内部给任何 T 类型创建实例的对象,因为泛型方法内部知道传进来的对象有哪些构造函数2):约束是对内部的!(对于泛型方法)约束也是会被继承的!3...
  • 例如,如果您程序中使用FileReader类从文件中读取数据,如果构造函数中指定的文件存在,则会发生FileNotFoundException,并且编译器会提示程序员处理该异常。示例importjava.io.File;importjava.io.FileRea....
  • 这就意味着, 一些处于迷糊状态的(coffee-deprived)开发者不能在组件内去做一些很愚蠢的事情, 就像这样: <pre><code> this.$http = 'Assign some random thing to the instance method'; this.$http.get...
  • scrapy数据建模与请求 学习目标: 应用 scrapy项目进行建模 ...配合注释一起可以清晰的知道要抓取哪些字段,没有定义的字段不能抓取,目标字段少的时候可以使用字典代替 使用scrapy的一些特定组件需要Item
  • scrapy数据建模与请求 学习目标: 应用 scrapy项目进行建模 ...配合注释一起可以清晰的知道要抓取哪些字段,没有定义的字段不能抓取,目标字段少的时候可以使用字典代替 使用scrapy的一些特定组件需要Item
  • 总是在构造函数初始化列表列出所有成员变量,虽然类类型的变量会使用默认构造函数初始化,但写出来以避免还得记住哪些成员变量需显式初始化。内置类型变量的赋值和初始化成本相当,但最好也在构造函数初始化列表...
  • 引用类型如果没有通过构造函数初始化,则会指向空,其值为null,内存会有一块被置为0。 但是值类型却不能为空,它一定有一个默认值,因为值类型的值就是它本身,所以不会为空。 1. 但是有些时候,默认值也可能...
  • 代码编译运行环境:VS2012+Win32+Debug。 1.C++数据类型简介 ...为了能够体现C++语言和传统C语言非基本数据类型上的区别,这里把能够体现面向对象特性的非基本数据类型成为构造函数类型,而将其
  • 背景大部分的方法和构造函数对传入的参数值有一些限制,比如:常见的索引值必须是非负数,对象引用不能为空。你应该使用清晰的文档来标注所有的这些限制,然后方法体开始的地方强制他们检查。应该错误发生的时候...
  • 21天学通C++ (中文第五版)

    热门讨论 2010-06-23 16:57:03
    4.10 嵌套if语句中使用大括号 4.11 使用逻辑运算符 4.11.1 逻辑AND运算符 4.11.2 逻辑OR运算符 4.11.3 逻辑NOT运算符 4.12 简化求值 4.13 关系运算符的优先级 4.14 再谈真和假 4.15 条件运算符(三日运算符...
  • 如果程序员构造函数中使用new来分配动态内存,就 有责任提供适当的析构函数,定义显式复制构造函数和显式赋值操作符。本章介绍了程序员没有提供显 式定义时,将如何隐式地生成成员函数以及这些成员函数的...
  • 如果程序员构造函数中使用new来分配动态内存,就 有责任提供适当的析构函数,定义显式复制构造函数和显式赋值操作符。本章介绍了程序员没有提供显 式定义时,将如何隐式地生成成员函数以及这些成员函数的...
  • 多态

    2020-09-29 23:25:59
    1、多态的实现原理 多态是用父类的指针指向子类的实例,为实现C++多态,使用了一种动态绑定的技术,这个技术的...3、哪些函数不能做虚函数 构造函数 内联函数:用编译阶段 静态函数:因为静态函数属于类,不属于
  • 如果程序员构造函数中使用new来分配动态内存,就 有责任提供适当的析构函数,定义显式复制构造函数和显式赋值操作符。本章介绍了程序员没有提供显 式定义时,将如何隐式地生成成员函数以及这些成员函数的...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 184
精华内容 73
关键字:

哪些函数不能在构造函数中使用