构造函数的几种方式

工厂模式

使用工厂模式构造函数,系统会在函数内部自动帮你定义一个对象,如:

var obj = new Object();

函数构建完成后系统还会自动帮你返回一个对象,如:

return this;

工厂模式分为三个步骤构造函数:
1.原料:原料这个步骤其实就是上面所说的构造对象,系统会自动帮你解决这个问题;
2.加工:这个步骤需要自己动手完成!这个过程就是创建这个构造函数中的方法:

obj.showQQ=function (){
    alert('我的QQ号:'+this.qq);
};

3.出厂:这个步骤就是返回一个this(obj)对象,当然这个步骤也是系统完成的;

函数构造完成后在外部就可以直接定义一个变量,这个变量可以直接调用函数的中的方法。

混合模式

混合模式构造函数,就是将工厂方式细化,使用构造函数创建属性,使用原型创建方法。

使用混合模式,对构造函数的命名有一定的要求,最好是函数名首字母大写。
下面举个例子说明混合模式的写法:

// 构造函数加属性
function Fn(id){
    this.box = document.getElementById(id);
    this.init();
}
// 原型创建方法
Fn.prototyopr.init = function(){
    this.box.style.backgroundColor = 'green';
}
// 通过调用init方法将div的背景色改成绿色

window.onload = function(){
    var oDiv = new Fn('box');
    oDiv.init();
}
<think>首先,用户的问题是基于之前的内容,查询“C++构造函数几种形式”。查阅对话历史,用户提供了引用[1]和引用[2],这些内容讨论了C++构造函数几种类型。 回顾引用内容: - 引用[1]提到了C++中的几种构造函数:默认构造函数、初始化构造函数(有参构造函数)、复制构造函数(拷贝构造函数)、转换构造函数。 - 引用[2]讨论了构造函数赋初值的几种形式,包括无参构造函数使用初始化列表。 用户明确表示:“我想查找C++构造函数几种形式”,所以我的回答应该聚焦在这个主题上。 根据系统级指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 从引用内容中提取关键信息: - 构造函数几种形式包括: 1. 默认构造函数:无参或所有参数有默认值。 2. 初始化构造函数(有参构造函数):带参数。 3. 复制构造函数(拷贝构造函数):参数是该类的引用。 4. 转换构造函数:带有单个参数的构造函数,可以将其他类型转换成类类型。 引用[2]补充了构造函数赋初值的语法,使用初始化列表。 我的回答结构应该清晰、可靠。组织成: - 引言:简要介绍构造函数。 - 主体:分点列出构造函数几种形式,提供示例代码。 - 结尾:总结或生成相关问题。 生成相关问题: - 根据系统指令,在回答结束后添加“相关问题”部分。 - 相关问题应基于主题,如:优化、应用场景、常见错误等。 确保LaTeX语法正确:尽管主题是编程,但可能涉及数学表达式,如参数类型。示例中主要是代码,所以可能不需要太多LaTeX,但如果描述方程,要用$...$。 现在,构建回答: 1. **引言**:解释构造函数的概念。 2. **几种形式**: - 默认构造函数 - 有参构造函数 - 拷贝构造函数 - 转换构造函数 - 使用初始化列表赋初值(引用[2]中提到的) 3. **示例代码**:从引用中提取或简化,展示每种形式。 4. **引用标识**:在相关部分末尾添加[^1]或[^2]。 5. **相关问题**:生成2-3个相关问题。 最终回答结构: - 用中文。 - 清晰段落。 - 代码块用```...```格式(虽然不是LaTeX,但指令是针对数学表达式)。 - 相关问题在末尾。 </think>### C++构造函数几种形式 在C++中,构造函数是类的特殊成员函数,用于初始化对象的成员变量。它在对象创建时自动调用,且函数名必须与类名相同。根据参数类型和功能,C++构造函数可分为以下几种主要形式: 1. **默认构造函数** - 无参数或所有参数有默认值。 - 用于创建对象时自动初始化成员变量。 - 示例代码: ```cpp class Student { public: Student() : num(1001), age(18) {} // 默认构造函数 private: int num; int age; }; ``` 在`Student s1;`中自动调用并初始化`s1.num=1001`, `s1.age=18`[^1]。 2. **有参构造函数(初始化构造函数)** - 带有参数的构造函数。 - 通过参数显式设置成员变量的初始值。 - 示例代码: ```cpp class Student { public: Student(int n, int a) : num(n), age(a) {} // 有参构造函数 private: int num; int age; }; ``` 在`Student s2(1002, 18);`中调用并初始化`s2.num=1002`, `s2.age=18`[^1]。 3. **拷贝构造函数** - 参数为本类对象的引用(形如`ClassName(ClassName& obj)`)。 - 用于通过现有对象初始化新对象(深拷贝或浅拷贝)。 - 示例代码: ```cpp class Student { public: Student(Student& s) { // 拷贝构造函数 num = s.num; age = s.age; } private: int num; int age; }; ``` 在`Student s3 = s1;`中调用,将`s1`的值复制到`s3`[^1]。 4. **转换构造函数** - 只有一个参数,且参数类型不是本类(例如`int`)。 - 实现隐式类型转换(如将`int`转换为`Student`对象)。 - 示例代码: ```cpp class Student { public: Student(int r) : num(r) {} // 转换构造函数 private: int num; }; ``` 在`Student s4 = 1003;`中调用,将`1003`转为`s4.num=1003`[^1]。 5. **使用初始化列表赋初值的形式** - 在构造函数后使用`:`语法初始化成员变量(适用于所有构造函数类型)。 - 优点:效率高,可直接初始化而不需赋值。 - 示例代码: ```cpp class myClass { public: int val; string str; myClass() : val(10), str("ABC") {} // 初始化列表赋初值 }; ``` 在`myClass mc;`中自动设置`mc.val=10`, `mc.str="ABC"`[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值