构造函数

C++11 关键字default和delete

江枫思渺然 提交于 2020-02-25 01:15:24
1、 =default 和=delete 概述 任何事物的出现都必然有着其出现的理由,伴随着每一个新的概念产生都会带来一系列的便利和价值。C++在不断的演变与发展,与此同时,伴随着许多新的特性和功能产生。=default、=delete 是C++11的新特性,分别为:显式缺省(告知编译器生成函数默认的缺省版本)和显式删除(告知编译器不生成函数默认的缺省版本)。C++11中引进这两种新特性的目的是为了增强对“类默认函数的控制”,从而让程序员更加精准地去控制默认版本的函数。 其具体的功能和使用方法下面将一一道来。 2、 类与默认函数 在讲解关键字 default和delete 之前,先对类和类的默认函数作下描述与说明,从而加深对这两个关键字的理解与认知。既要知其然,也要知其所以然。C++中,当我们设计与编写一个类时,若不显著写明,则类会默认为我们提供如下几个函数: 1 构造函数 2 析构函数 3 拷贝构造函数 4 拷贝赋值函数(operator=) 5 移动构造函数 以及全局的默认操作符函数 1 operator, 2 operator & 3 operator && 4 operator * 5 operator-> 6 operator->* 7 operator new 8 operator delete 注:若我们在类中实现了这些版本之后,编译器便不会生成其对应的默认函数版本

面向对象小结

こ雲淡風輕ζ 提交于 2020-02-24 23:07:02
面向对象是相对面向过程而言的,面向过程强调的是功能行为,面向对象是将功能封装进对象,强调具备了功能的对象。 [万物皆对象] 面向对象三大特征:封装、继承、多态 类和对象的关系: 类:对现实生活中事物的描述 对象:就是这类事物,实实在在存在个体 描述事物就是描述事物的属性(对应类中变量)和行为(对应类中方法),属性和行为共同 称为类的成员(成员变童和成员方法) 成员变量作用于整个类中,局部变量作用于函数中,或者语句中 成员变量在堆内存中,因为对象的存在,才在内存中存在 局部变量:存在栈内存中 封装: 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式 好处:将变化隔离、便于使用、提高重用性、提高安全性 封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问 private (私有):权限修饰符,用于修饰类中的成员(成员变里,成员函数),私有只在本类 中有效。 static用于修饰成员(成员变里和成员函数) 被儋饰的成员:随着类的加载而加载,优先于对象存在,被所有对象所共享,可以直接被类 名调用。 类名.静态成员[方法区、共享区、数据区]_--存放类中的方法和共享数据。 什么时候定义静态函数:当功能内部没有访问到非静态数据(对象的特有数据),那么该功 能可以定义成静态的,用类名直接调用。 继承: 1、提高了代码的复用性 2、让类与类之间产生了关系,有了这个关系

值类型和引用类型

谁说胖子不能爱 提交于 2020-02-24 22:49:26
值类型和引用类型的区别 1. 值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的 地址。 2.将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象本身。 3. 值类型存取速度较快,引用类型存取速度较慢。 4. 值类型从System.ValueType类派生,引用类型从System.Object派生,其中,System.ValueType又是从System.Object 派生出来的,枚举从System.Enum抽象类派生,而System.Enum抽象类从System.ValueType派生出来的,所以枚举也是一个 值类型。 5.值类型不可能包含 null 值: 6.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。 栈和堆的区别 栈就是编译期间就分配好的内存空间,堆是程序运行期间动态分配的内存空间 .net中哪些是值类类型,哪些是引用类型? 以结构体和类说明值类型和引用类型的区别 结构体--值类型,类--引用类型 区别:类当中默认的有一个无参数的构造方法(构造函数),当在类中写一个有参数的构造函数,默认无参数的构造函数被干掉了 类当中写构造函数参数列表中参数个数可以不确定,除了无参的构造函数之外,有参的构造函数也可以有多个重载 在结构中默认的也有一个无参数的构造函数

JS基础——原型与原型链

青春壹個敷衍的年華 提交于 2020-02-24 21:59:58
前言 最近在整理一些js的基础知识刚好整理到原型 构造函数 每个构造函数(constructor)都有一个原型对象(prototype), 原型对象都包含一个指向构造函数的指针, 而实例(instance)都包含一个指向原型对象的内部指针. 先来看一个例子 function Person(name, age, job) { this.name = name this.age = age this.job = job this.sayName = function() { alert(this.name) } } var person1 = new Person('Zaxlct', 28, 'Engineer') var person2 = new Person('Mick', 23, 'Doctor') 上面的例子中 person1 和 person2 都是 Person 的实例。这两个实例都有一个 constructor (构造函数)属性,该属性(是一个指针)指向 Person。 即: console.log(person1.constructor == Person) //true console.log(person2.constructor == Person) //true prototype 每个构造函数都有一个 prototype 属性

第十章 对象和类复习题

梦想与她 提交于 2020-02-24 21:19:50
就是拥有相等功能和相同的属性的对象的集合 2. 类是对象的抽象,通过将属性与方法封装在一个类中,且设置访问权限,对外只提供部分接口来实现封装与隐藏。 3. 类是对象的抽象,而对象是类的具体实例。 4. 函数成员对数据成员进行操作,数据成员就是类对象的属性 5. class account { private : string name ; string id ; double deposit ; public : account ( ) ; account ( string n , string i , double d ) ; void show ( ) const ; void account_in ( ) ; void acocunt_out ( ) ; } ; 在创建类对象或显示调用构造函数时,类的构造函数都将被调用。当对象过期时,类的析构函数将被调用。 8. 默认构造函数是没有参数或所有参数都有默认值的构造函数。拥有默认构造函数后,可以声明对象,而不初始化它,即使已经定义了初始化构造函数。它还使得能够声明数组。 10.this指针是类方法可以使用的指针,它指向用于调用方法的对象。因此,this是对象的地址,*this是对象本身。 来源: CSDN 作者: zl吉姆餐厅 链接: https://blog.csdn.net/qq_32631105/article

C++类的六个特殊成员函数

有些话、适合烂在心里 提交于 2020-02-24 21:07:36
1.设置六个函数的参数,先让函数运行起来 // // Created by liuhao on 20-1-1. // //================================================================================= #include <iostream> //using namespace std; class Stu { private: std::string name = "无名氏 "; int age = 0; int *d = nullptr; public: Stu() { std::cout << name << age << " 执行了无参构造函数!" << std::endl; }; Stu(int a) { std::cout << name << age << " 执行了有参构造函数!" << std::endl; }; Stu(const Stu &s) { std::cout << name << age << " 执行了拷贝构造函数!" << std::endl; }; Stu &operator=(const Stu &s) { std::cout << name << age << " 执行了拷贝赋值运算符函数!" << std::endl; }; Stu(Stu &&s) {

多线程笔记 - 单例

自古美人都是妖i 提交于 2020-02-24 19:30:59
单例创建实例, 网上有很多的例子, 我这里也只是做一下笔记. 可能并不比别人的详细. 主要是为了自己做点云笔记. 1. 饿汉式 public class Ehan { //1. 提供一个静态实例 private final static Ehan instance = new Ehan(); //2. 私有化构造函数 private Ehan(){} //提供一个对外获取实例的方法 public static Ehan getInstance(){ return instance; } } 测试: public static void main(String[] args){ for (int i = 0; i < 100; i++) { new Thread(() -> { Ehan obj = Ehan.getInstance(); System.out.println(obj.hashCode()); }, "thread" + i).start(); } } 结果: 所有的 hashcode 都是一样的, 说明是同一个实例. 优点: 线程安全的 缺点: 类加载的时候, 就完成实例化了(如使用了该类的其他静态属性或静态方法, 就会完成实例化, 但事实上, 我可能并不需要他实例化). 如果后面我并不使用这个类, 那不是浪费了么. 2. 懒汉式 public class

C#的New关键字的几种用法

陌路散爱 提交于 2020-02-24 18:49:22
  在C#中,new关键字主要有如下三种用法: new 运算符 用于创建对象和调用构造函数。 new 修饰符 用于隐藏基类成员的继承成员。 new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型。 1.new 运算符   1).用于创建对象和调用构造函数 示例:Class_Test MyClass = new Class_Test();   2).也用于为值类型调用默认的构造函数 示例:int myInt = new int();   myInt 初始化为 0,它是 int 类型的默认值。该语句的效果等同于:int myInt = 0;   3).不能重载 new 运算符。   4).如果 new 运算符分配内存失败,则它将引发 OutOfMemoryException 异常。 2.new 修饰符   使用 new 修饰符显式隐藏从基类继承的成员。若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。   请看下面的类: 1   public class MyClass 2   { 3    public int x; 4    5    public void Invoke() {} 6    7    }   在派生类中用 Invoke 名称声明成员会隐藏基类中的 Invoke 方法,即:    public class

C#的New关键字的几种用法

五迷三道 提交于 2020-02-24 18:46:23
   一、在C#中,new这个关键字使用频率非常高,主要有3个功能: a) 作为运算符用来创建一个对象和调用构造函数。 b) 作为修饰符。 c) 用于在泛型声明中约束可能用作类型参数的参数的类型。 1.new 运算符 用于创建对象和调用构造函数。   1.用于创建对象和调用构造函数   例:People p=new People();   2.也用于为值类型调用默认的构造函数   例:int num= new int();   num初始化为 0,它是 int 类型的默认值。该语句的效果等同于:int myInt = 0;   3.不能重载 new 运算符。   4.如果 new 运算符分配内存失败,则它将引发 OutOfMemoryException 异常。 2.new 修饰符 用于向基类成员隐藏继承成员。   使用 new 修饰符显式隐藏从基类继承的成员。若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。在用作修饰符时,new关键字可以在派生类中隐藏基类的方法,也就说在使用派生类的方法是调用的方法是New关键字新定义出来的方法,而不是基类的方法。在不使用New关键字来隐藏基类方法也是可以的,编译器会出现一个警告,提示如果有意去隐藏基类的方法,请使用New关键字修饰。   这里有个注意事项就是New和Override这两个关键字是互斥的

C++学习笔记 第十九课 深拷贝

怎甘沉沦 提交于 2020-02-24 14:26:50
学习笔记内容来自:狄泰软件学院 唐佐林老师 的视频,十分感谢您的指导 特殊的构造函数 无参构造函数 当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且函数体为空 拷贝构造函数 当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制 所以,下列定义的类并不是空的,因为有隐藏的默认提供的无参构造函数和拷贝构造函数 class Test{}; 初始化和赋值 在C++中,初始化和赋值不一样,初始化会触发构造函数,而赋值不会 拷贝构造函数 1.格式:claas_name(const class_name& another){} 2.意义:兼容C语言的初始化方式 拷贝构造函数中的深拷贝和浅拷贝 1.浅拷贝:拷贝后对象的物理状态相同 2.深拷贝:拷贝后对象的逻辑状态相同 PS:编译器提供的拷贝构造函数只进行浅拷贝 什么时候需要进行深拷贝 1.对象中有成员指代了系统中的资源 2.成员指向了动态内存空间 3.成员打开了外存中的文件 4.成员使用了系统中的端口 5… 示例程序: class Array { private : int * m_data ; int m_length ; public : Array ( ) { data = new int [ 5 ] ; } Array ( const Array & another ) { /* *