C++ 类的构造函数使用规则

//类的构造函数使用规则
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class PointA{

};

class PointB{
public:
    PointB(int _a, int _b, const char *pin/*in*/){
        x = _a;
        y = _b;
        remark = (char *)malloc(sizeof(char)*(strlen(pin) + 1));
        strcpy(remark, pin);
        cout << "我是自定义的有参构造函数4" << endl;
    }
private:
    int x;
    int y;
    char *remark;
};

class PointC{
public:
    PointC(PointC &pm){
        cout << "我是自定义的拷贝构造函数3" << endl;
        //修改拷贝构造函数
        x = pm.x;
        y = pm.y;
        //remark = pm.remark; 这句话错误
        //修改后的方案
        remark = (char *)malloc(sizeof(char)*(strlen(pm.remark) + 1));
        strcpy(remark, pm.remark);
    }
private:
    int x;
    int y;
    char *remark;
};

void ProtectA(){
    PointA p1;//调用默认无参构造函数
    PointA p2=p1;//调用默认拷贝构造函数
    //结论①:当类中没有定义任何一个构造函数时,c++编译器会提供无参构造函数和拷贝构造函数

    //PointB p3; //报错: error C2512: “PointB”: 没有合适的默认构造函数可用
    PointB p4(3,3,"455");//调用自定义有参构造函数
    PointB p5 = p4;//调用默认拷贝构造函数
    //结论②:当类中定义了任意的非拷贝构造函数(无参,有参),c++编译器不会提供无参构造函数,
    //但是如果类中也没有定义任意的拷贝函数,那么c++编译器还是会提供默认拷贝构造函数

    //PointC p6; //报错   error C2512: “PointC”: 没有合适的默认构造函数可用
    //结论③:当类中定义了拷贝函数时,c++编译器不会提供默认的无参构造函数

    //结论④:默认拷贝构造函数只是类成员变量间的简单赋值(详情参考类的浅拷贝)
}

void main(){

    system("pause");
}
时间: 2024-10-19 22:23:52

C++ 类的构造函数使用规则的相关文章

对C++中派生类的构造函数和析构函数的认识

一:构造函数 形式:派生类名::派生类名:基类名1(参数1),基类名2(参数2),--基类名n(参数n),数据成员1(参数1),数据成员2(参数2),--数据成员n(参数n){ 各种操作的说明 } 执行过程:先执行基类的构造函数,再进行数据成员的赋值,最后执行函数体. 其中基类名和数据成员的顺序是由在派生类的定义中声明的顺序决定执行的顺序的,因此它们的顺序是任意的,但为了可读性,还是最好按顺序写. 如果基类只有默认构造函数,则基类名和参数表可以不用写出来. 二:复制构造函数 派生类的构造函数的形

C++:派生类的构造函数和析构函数

4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类的派生类的析构函数,随后再执行基类的析构函数. //例4.5 派生类的构造函数和析构函的执行顺序 #include<iostream> using namespace std; class Base{ //声明基类Base public: Base() { cout<<"Co

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

【C++学习之路】派生类的构造函数(二)

二.有内嵌对象的派生类 1.一般来说,我们会这样定义构造函数 student( int i, string nam, int pid, string pnam, int sid) : person( i, nam),parent(pid,pnam){ stuid = sid; } person是基类的构造函数,parent是该派生类内嵌的person子对象   2.具体例子 1 #include <iostream> 2 using namespace std; 3 class A 4 { 5

ThinkPHP中的__initialize()和类的构造函数__construct()

ThinkPHP中的__initialize()和类的构造函数__construct()网上有很多关于__initialize()的说法和用法,总感觉不对头,所以自己测试了一下.将结果和大家分享.不对请更正.首先,我要说的是1.__initialize()不是php类中的函数,php类的构造函数只有__construct().2.类的初始化:子类如果有自己的构造函数(__construct()),则调用自己的进行初始化,如果没有,则调用父类的构造函数进行自己的初始化.3.当子类和父类都有__co

C++构造函数 &amp; 拷贝构造函数 &amp; 派生类的构造函数 &amp; 虚继承的构造函数

构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 .特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载.(摘自百度百科构造函数). 一.最基本的构造函数 1 class Base 2 { 3 public: 4 Base(int var) : m_Var(var) 5 { 6 } 7 private: 8 int m_Var; 9 }; 以上构造函数的执行过程:

c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)

现在来测试一下在多重继承,虚继承,MI继承中虚继承中构造函数的调用情况. 先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; }

面向对象:有关类和构造函数的基础知识

1.类和对象对象:具体存在的,可以被描述的实体 属性和行为类:具有共同属性和相同行为的多个对象的抽象 对象:具体的 实体类:抽象的 概念 类是对象的抽象 对象是类得具体实例 2.创建和使用类访问修饰符 [可选修饰符]class 类名{//类成员 //字段 > 数据 //属性 > 对字段的封装 //索引器 > 对集合类型字段的封装 //方法 > 对象的特殊行为 //事件 > 行为 //构造函数 > 初始化 } 字段:访问修饰符 数据类型 变量名; 使用:a.创建对象类名

scala入门教程:scala中的面向对象定义类,构造函数,继承

我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面一行代码就是一个scala类的定义: 首先是关键字class 其后是类名 Point 类名之后的括号中是构造函数的参数列表,这里相当于定义了对象的两个常量,其名称分别为x,y,类型都是Int 上面的类和下面的类是一致的,不过更精简了. class Point (xArg:Int, yArg:Int)