构造函数

C++ Debug:Invalid address specified to RtlValidateHeap

一世执手 提交于 2020-02-02 15:39:39
@Author:CSU张扬 @Email:csuzhangyang@gmail.com or csuzhangyang@qq.com @我的网站: https://www.faker.top Invalid address specified to RtlValidateHeap 1. 问题概述 报错如下: HEAP [ String . exe ] : Invalid address specified to RtlValidateHeap ( 02730000 , 0274 ED98 ) 监视窗口各变量的值: 异常位置发生在 v.push_back(std::move(s2)); ,该语句进入了 free() 函数, 异常最后在函数 free() 的最后。 free() 是我自定义的 String 类的析构函数内容,释放 allocator 分配的内存。 class String { public : // 省略一部分代码。。。 // 正确的代码 String ( String && s ) noexcept : sz ( s . sz ) , p ( s . p ) { s . p = 0 ; s . sz = 0 ; std :: cout << "move constructor" << std :: endl ; } // 错误的代码 // String(String&

类和结构的区别

时光怂恿深爱的人放手 提交于 2020-02-02 12:15:19
区别如下: 1.存储类型: 结构是值类型 ,存储在栈上。 类是引用类型 ,存储在栈上和堆上,堆上存储真实数据,栈上存储存储地址,修改一个引用的值,另一个相同的引用的值就会发生改变。 2.继承性: 类是可以继承的 ,它可以继承其他的类或者接口,也可以 被继承 ,并且,类的许多特性是通过继承来展现的,要 阻止类的继承 , 必须显示的声明sealed 。 结构没有继承 :它不能继承另一个结构或者类,也不能被继承。也正因为如此, 结构不能有抽象成员 。虽然结构没有明确的用sealed声明,可是结构是隐式的。结构能够继承接口,方法和类继承接口是一样的 3.初始化:类可以在声明的时候初始化,结构不能在申明的时候初始化(不能在结构中初始化字段),否则报错。 4.构造函数:类和结构都有自己默认的构造函数。在类中,一旦我们编写了带参数构造函数,默认构造函数就不存在了。当我们要调用不带参数的构造函数来初始化对象时,我们必须再自己编写一个不带参数的构造函数。但是在 结构中,始终存在一个不带参数的默认构造函数 ,并且,这个构造函数是不可替代的,不能重写,也不能覆盖, 在结构中,我们只能编写带参数的构造函数,不能编写不带参数的构造函数 5.析构函数: 类有析构函数,但是结构没有析构函数 6.关键字:在类中可以使用但是在结构中限制使用的关键字有:abstract、sealed、protected

JDK动态代理

爷,独闯天下 提交于 2020-02-02 10:03:29
一、基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念。代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念。这里引用维基百科上的一句话对代理进行定义: A proxy is an agent or substitute authorized to act for another person or a document which authorizes the agent so to act. 意思是说:代理指的是一个代理人(或替代品),它被授权代表另外一个人(或文档)。 从这个简明扼要的定义中,可以看出代理的一些特性:1.代理存在的意义就是代表另一个事物。2.代理至少需要完成(或实现)它所代表的事物的功能。 2.什么是JAVA静态代理? JAVA静态代理是指由程序员创建或工具生成的代理类,这个类在编译期就已经是确定了的,存在的。 典型的静态代理模式一般包含三类角色: 1.抽象角色:它的作用是定义一组行为规范。抽象角色一般呈现为接口(或抽象类),这些接口(或抽象类)中定义的方法就是待实现的。 2.真实角色:实现了抽象角色所定义的行为。真实角色就是个普通的类,它需要实现抽象角色定义的那些接口。 3.代理角色:代表真实角色的角色。根据上面代理的定义,我们可以知道代理角色需要至少完成(或实现)真实角色的功能。为了完成这一使命

结构体 和 类 的区别

喜夏-厌秋 提交于 2020-02-02 09:31:06
1.class 是引用类型, struct 是值类型 2.定义类用 class,定义结构体用 struct 3.结构体中,不能对字段或者属性进行初始化 4.class有默认的无参数的构造函数,但如果显示的定义了一个构造函数,编译器就不会再自动生成隐式的无参数的构造函数了;而struct,无论你是否显示的定义了构造函数,隐式的无参数的构造函数都一致存在 5.struct 不能显示的定义无参数的构造函数 6.在struct中,如果显示定定义了有参数的构造函数,那么必须给所有的字段赋值 7.struct 不能继承结构或者类,但可以实现接口.class 可以继承 类,实现接口,但是不能继承 struct 8.struct 不能定义析构函数,class 可以 9.结构体不能用 abstract,sealed 修饰 来源: https://www.cnblogs.com/refuge/p/8553742.html

Java基础(6)--继承(上)

☆樱花仙子☆ 提交于 2020-02-02 09:27:30
6.1 继承概述 6.2 继承的特点 6.3 super关键字 6.4 函数覆盖 6.5 子类实例化 6.6 final关键字 6.1 继承概述 1. 多个类中存在 相同属性 和 行为 时,将这些内容抽取到 单独一个类 中,那么多个类无需再定义这些属性和行为,只要 继承 那个类即可。 2. 多个类可以称为 子类 ,单独这个类称为 父类 或者 超类 。 3. 子类可以 直接访问 父类中的 非私有的属性 和 行为 。 4. 通过 extends 关键字让类与类之间产生继承关系。 class SubDemo extends Demo{} 5. 继承的出现 提高了代码的复用性 。 6. 继承的出现让 类与类之间产生了关系 ,提供了多态的前提。 class Person //父类,基类 { String name; int age; } class Student extends Person //子类继承父类 { void study() { System.out.println("Student study!"); } } class Worker extends Person //子类继承父类 { void work() { System.out.println("Worker work!"); } } class ExtendsDemo { public static void

C++ explicit关键字详解

社会主义新天地 提交于 2020-02-02 09:06:40
首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式). 那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子: class CxString // 没有使用explicit关键字的类声明, 即默认为隐式声明 { public: char *_pstr; int _size; CxString(int size) { _size = size; // string的预设大小 _pstr = malloc(size + 1); // 分配string的内存 memset(_pstr, 0, size + 1); } CxString(const char *p) { int size = strlen(p); _pstr = malloc(size + 1); // 分配string的内存 strcpy(_pstr, p); // 复制字符串 _size = strlen(_pstr); } // 析构函数这里不讨论, 省略... }; // 下面是调用: CxString string1(24); // 这样是OK的, 为CxString预分配24字节的大小的内存 CxString

类与结构的差别

谁说胖子不能爱 提交于 2020-02-02 01:57:10
二 .类与结构的差别 1. 值类型与引用类型 结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型 类是引用类型:引用类型在堆上分配地址 堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑 因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用 注: 1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object 2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用 2.继承性 结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed . 类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承 注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样 例如:结构实现接口 interface IImage { void Paint(); }

C++实现从数组到链表,从前序遍历到中序遍历

主宰稳场 提交于 2020-02-01 23:22:24
从数组构造链表的资料比较少,大多数都是直接从控制台输入,故写下此文。重点在preOrder函数。 插入一个preOrder函数里面的一个 疑问 :直接用结构体的构造函数写的root往往只剩下头节点,而用New的方式却能够构造完整的链表,这是为什么呢? 如果你知道的话,欢迎你在评论区留言 :) int main(void) { vector<int> nums1 = { 1,NULL, 2, 5 }; vector<int> inorder_result; TreeNode *T; T = preOrder(nums1, 0); //构造代码 cout << "前序列遍历输出: \n"; preOderread(T); //前序列遍历输出 cout << "\n 中序列遍历输出: \n"; inorder_result = inorderTraversal(T); //数组改为中序列遍历的数组 inOderread(inorder_result);//中序列遍历输出 destroy(T); system("pause"); } 接下来是用到的主要函数文件,头函数在最后的部分 #include<iostream> #include <vector> #include "inorderTraversal.h" using namespace std; //中序遍历迭代函数 void

C++学习笔记(五)

删除回忆录丶 提交于 2020-02-01 22:46:39
复制构造函数 简介 只有一个参数,那个参数是对同类的对象的引用(不能是对象) 格式:X::X(const x&)或X::X(x&) 如果自己没有定义,则编译器会自动生成一个,完成复制功能 如果自己定义了,则不再自动生成 起作用的三种情况 用一个对象去初始化另一个同类的对象时 这两句的作用相同 如果某个函数有个参数是类A的对象,那么该函数被调用时,类A的复制构造函数将被调用 class A {public: A(){}; A(A&a) { cout<<"copy"<<endl; } //这是复制构造函数 }; void Func(A a1){} int main() { A a2; Func(a2); return 0; } 运行结果:copy 所以,如果复制函数不是用来复制对象,就会出现形参未必等于实参的情况。 如果函数的返回值是类A的对象,则返回时,A的复制构造函数会被调用 注意 :对象间的赋值并不导致复制构造函数的调用 例如 : 来源: https://www.cnblogs.com/CCchaos/p/12250150.html

copy control 复制控制

风格不统一 提交于 2020-02-01 16:36:55
每种类型,无论是内置类型还是类类型,都对该类型对象的一组(可能为空的)操作的含义进行了定义.比如,我们可以将两个int值相加,运行vector对象的size操作,等等.这些操作定义了用给定类型的对象可以完成什么任务. 复制构造函数 , 赋值操作符 和 析构函数 总称为 复制控制(copy control). 编译器自动实现这些操作,但类也可以定义自己的版本. 复制构造函数: 直接初始化 和 复制初始化. string null_book = "9-99-99999-9";// copy-initialization string dots(10,'.'); // direct-initializaton string empty_copy=string(); // copy-initialization string empty_direct; // direct-initialization 合成的复制构造函数 如果我们没有定义复制构造函数,编译器会给我们合成一个.与合成的默认构造函数不同,即使我们定义了其他构造函数,也会合成复制构造函数.合成复制构造函数(synthesized copy constructor)的行为是,执行逐个成员初始化(memberwise initialize),将新对象初始化为原对象的副本. 所谓"逐个成员"