构造函数

MFC学习笔记之八————颜色对话框与字体对话框

假装没事ソ 提交于 2020-03-02 05:32:20
当程序中需要用到画图的时候,就要选择画笔的颜色,在MFC中提供了一个CColorDialog的类,通过此类可以很方便的创建这样一个颜色对话框。其构造函数如下: CColorDialog( COLORREF clrInit = 0, DWORD dwFlags = 0, CWnd* pParentWnd = NULL );    该构造函数含有三个参数,其中 clrInit :指定默认的颜色选择,默认是黑色。 dwFlags :指定一组标记,用来定制颜色对话框的功能和它的外观。 pParentWnd :指向颜色对话框父窗口,后者拥有者窗口的指针。 我们可以使用dialog的doModal()函数创建颜色对话框。在CColorDialog类型中含有一个CHOOSECOLOR的结构体类型的成员变量: m_cc ,在CHOOSECOLOR结构体中含有一个rgbResult的成员变量,此变量即保存了用户所选择的颜色的,看看CHOOSECOLOR结构体: typedef struct { DWORD lStructSize; HWND hwndOwner; HWND hInstance; COLORREF rgbResult; COLORREF * lpCustColors; DWORD Flags; LPARAM lCustData; LPCCHOOKPROC lpfnHook;

Swift构造函数

谁说胖子不能爱 提交于 2020-03-02 05:30:33
1. 构造函数: 给属性开辟内存空间 给属性设置初始值 最终目标创建一个对象 用 init 构造函数 参数有可能不同 ( 1 ) // 定义属性使用 var 是我们开发需要的 var name : String // 可选属性 - 默认等于 nil 可以不需要在构造函数里进行初始化 title 属性没有分配内存空间 在其他地方设置值的时候才需要分配内存空间 var title : String ? //‘override’ 重写关键字 子类继承父类 需要对父类里面的方法进行扩展 就叫重写 // 调用 super init ()之前 保证子类初始化完成 // 在 swift 中 在当前工程 类都是全局共享的 不用导头文件 ( 2 )重载构造函数 函数名相同 参数名或者参数个数不同 就是重载 不仅限于构造函数 包括其他函数 // 属性名字和传入的参数一样 需要使用 self 区分 ( 3 )重写 // 如果当前类中提供了构造函数 则默认的构造函数没有了 因为默认的构造函数 init 无法给子类的属性进行初始化 2.KVC 本质: 在运行时动态向对象发送 setValue : forKey : ( 1 )可选类型的属性可以不在构造函数中初始化 ( 2 ) KVC 是 OC 特有的 age 在 swift 不兼容 基本数据类型不能使用可选类型 要进行初始化 ( 3

explicit和implicit

谁说胖子不能爱 提交于 2020-03-02 05:16:23
explicit是C++中的一个关键字,只用于修饰只有一个参数的构造函数: class A{ explicit A(const T obj); }; 该关键字告诉编译器该类只能显式的转换,不能隐式(implicit)的赋值。下面介绍一下显式转换和隐式转换的区别: 1 A a=b;//隐式的调用构造函数 2 A a(b);//显式的调用构造函数 google的c++规范中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。所以以后想项目中我决定只有单个传参的构造函数都用explicit修饰,以避免不必要的麻烦。 来源: https://www.cnblogs.com/howo/p/8393674.html

Java中创建对象的几种方式

北城余情 提交于 2020-03-02 03:40:18
Java中创建对象的五种方式:   作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字、使用Class类的newInstance方法、使用Constructor类的newInstance方法、使用Clone方法、使用反序列化。 使用new关键字:这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的够赞函数(无参的和有参的)。比如:Student student = new Student(); 使用Class类的newInstance方法:我们也可以使用Class类的newInstance方法创建对象,这个newInstance方法调用无参的构造器创建对象,如:Student student2 = (Student)Class.forName("根路径.Student").newInstance(); 或者:Student stu = Student.class.newInstance(); 使用Constructor类的newInstance方法:次方法和Class类的newInstance方法很像,java.lang.relect.Constructor类里也有一个newInstance方法可以创建对象

Replace Constructor with Factory Method (以工厂函数取...

匆匆过客 提交于 2020-03-02 02:42:48
Summary: 你希望在创建对象时不仅仅是做简单的建构动作。将构造函数替换为工厂函数。 Motivation: 使用该手法最显而易见的动机是在派生子类的过程中以工厂函数取代类型码。你可能常常需要根据类型码创建相应的对象,现在,创建名单上还得加上子类,那些子类也是根据类型码来创建。然而由于构造函数只能返回单一类型的对象,因此需要将构造函数替换为工厂函数。 此外,如果构造函数的功能不能满足需要,也可以使用工厂函数来代替它。工厂函数也是Change Value to Reference的基础。可以令工厂函数根据参数的个数和类型,选择不同的创建行为。 Mechanics: 1.新建一个工厂函数,让它调用现有的构造函数。 2.将调用构造函数的代码改为调用工厂函数。 3.每次替换后编译并测试 4.将构造函数声明为private 5.编译 范例1. 根据整数(实际是类型码)创建对象 以员工薪资系统为例,“Employee”表示“员工”: class Employee{ private int type; static final int ENGINEER = 0; static final int SALESMAN = 1; static final int MANAGER = 2; Employee(int type){ this.type = type; } }

类使用动态内存需注意的复制构造函数使用问题

人盡茶涼 提交于 2020-03-01 20:48:16
基础知识点介绍:复制构造函数 1、复制构造函数用于将一个对象复制到新创建的对象中。复制构造函数原型: Class_name ( const Class_name & ) ; // 接受一个类对象的常量引用。 2、何时调用复制构造函数: 新建一个对象并初始化为现有对象时调用,例如: ClassA b ( a ) ; ClassA c = a ; ClassA d = ClassA ( a ) ; ClassA * e = new ClassA ( a ) ; 注:1、中间两种可能直接利用复制构造函数创建c和d,也可能先创建临时对象然后将其中内容赋值给c和d。 2、函数按值传递和返回对象,都将调用。 因此建议传递引用,节省时间与空间 3、默认复制构造函数功能 1、逐个复制 非静态成员 到新对象中,复制的是成员的值 (浅复制) 。 存在的问题: 1、当存在 static 静态成员随构造函数调用增加时(计数器功能),默认复制构造函数不能实现。 2、当类中存在 new 初始化的指针(类对象申请了动态内存),默认构造函数只复制指针,不开辟新空间。 导致两个指针指向同一块动态内存(浅复制) ,析构时会造成二次释放。 解决方法: 自己定义复制构造函数。 1、在复制构造函数中改变 static 变量的值。 2、在复制构造函数中对于成员变量为数值的可以复制;对于 new 的指针,需要开辟独立的动态内存

侯捷C++编程(上)之构造函数

旧时模样 提交于 2020-03-01 20:20:11
构造函数 面向对象的编程语言C++,较于C曾被称为带类的C,把数据和方法封装起来。 1:对象的构造函数,在创建对象的时候被自动调用。 2:对象的构造函数可以重载为多个函数。 3:构造函数有特殊的赋值形式。 4:构造函数的名字与类名相同且没有返回值。 class complex { complex ( double x , double y ) { re = x ; im = y ; } //1 complex ( ) : re ( 0 ) , im ( 0 ) { } //2 complex ( double x , double y ) : re ( x ) , im ( y ) { } //3 complex ( double x = 0 , double y = 0 ) : re ( x ) , im ( y ) { } //4 private : double re , im ; } ; 上面四种构造函数都是合理的,比较来说在3和4效率最优,可以看出虽然2,4的参数不同但是依然不能共存,当创建一个对象如 complex C1;这时编译器就会矛盾是使用2还是4。 来源: CSDN 作者: Yiang24 链接: https://blog.csdn.net/idaxue/article/details/104589669

Inline-Static-Copy-New-Initlize

独自空忆成欢 提交于 2020-03-01 19:30:40
1:数据成员必须在构造函数初始化列表中初始化: 没有默认构造函数的内嵌对象 <基类没有构造函数> 引用类型的数据成员 int &rx 常数据成员 <const 修饰的变量> 成员类型是没有默认构造函数的类。 2:深拷贝和浅拷贝 c++默认的拷贝构造函数是浅拷贝 浅拷贝就是对象的数据成员之间的简单赋值,如你设计了一个没有类而没有提供它的复制构造函数,当用该类的一个对象去给令一个对象赋值时所执行的过程就是浅拷贝 class A { public: A(int _size) : size(_size) { data = new int[size]; } // 假如其中有一段动态分配的内存 A(){}; ~A() { delete [] data; } // 析构时释放资源 private: int* data; int size; } int main() { A a(5), b = a; // 注意这一句 } // err // 这里b的指针data和a的指针指向了堆上的同一块内存,a和b析构时,b先把其data指向的动态分配的内存释放了一次,而后a析构时又将这块已经被释放过的内存再释放一次。对同一块动态内存执行2次以上释放的结果是未定义的,所以这将导致内存泄露或程序崩溃。 深拷贝 所以这里就需要深拷贝来解决这个问题,深拷贝指的就是当拷贝对象中有对其他资源(如堆、文件、系统等)的引用时

JS高级

只谈情不闲聊 提交于 2020-03-01 15:35:11
1. 正则表达式: 2. String中的正则API: 1. 正则表达式: 2. String中的正则API: 查找: 1. 查找一个固定的关键词出现的位置: var i=str.indexOf("关键词"[,starti]) 在str中从starti位置开始找下一个"关键词"的位置 如果省略starti,则默认从0位置开始向后找 返回: “关键词”第一字所处位置的下标 如果找不到,返回-1 问题: 只支持查找一个固定不变的关键词 2. 用正则表达式查找一个关键词的位置: var i=str.search(/正则/i); 在str中查找符合"正则"要求的敏感词 返回值: 关键词的位置 如果找不到,返回-1 问题: 正则默认区分大小的! 解决: 在第2个/后加后缀i,表示ignore,意为:忽略大小写 问题: 只能获得关键词的位置,不能获得关键词的内容 解决: match 3. match: 1. 查找一个关键词的内容和位置: var arr=str.match(/正则/i); 在str中查找符合"正则"要求的敏感词的内容和位置 返回值: 数组arr:[ "0":"关键词", "index": 下标i ] 如果找不到: 返回null 问题: 只能查找第一个关键词,不能查找更多关键词 2. 查找所有关键词的内容: var arr=str.match(/正则/ig) //g global

【宠粉通道】叫我讲解的一道前端JS面试题-灵魂三问:prototype?类的prototype是什么?对象的proto是什么

余生颓废 提交于 2020-03-01 14:10:10
作者 | Jeskson 来源 | 达达前端小酒馆 1 究竟是什么样的题目让我徒弟疑惑呢?让我们看看截图先,来源于wx群: 看看我是怎么回答的: function Foo() { getName = function () { alert (1); }; return this; } var getName; //只提升变量声明 function getName() { alert (5);} //提升函数声明,覆盖var的声明 Foo.getName = function () { alert (2);}; Foo.prototype.getName = function () { alert (3);}; getName = function () { alert (4);}; //最终的赋值再次覆盖function getName声明 getName(); //最终输出4 看懂没呢?没看懂也别急哈: 先让我们了解函数的定义: 函数声明,可以先调用再声明 dadaFn(); function dadaFn(){ console.log(dadaFn); } / 返回 f -> function function dadaFn() { console.log(dadaFn); } 函数表达式,先声明再调用: let daDafn = function() { console