调用拷贝构造函数的几种情况

本文详细介绍了C++中拷贝构造函数的作用和应用场景,包括显式调用(如对象初始化)和隐式调用(如值传递)。强调了在定义拷贝构造函数时参数必须为引用以防止无限递归,并通过实例展示了如何在值传递参数的函数中避免调用拷贝构造函数。同时,讨论了返回值值传递时如何影响拷贝构造函数的调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拷贝构造是构造函数的重载形式,参数只有一个,必须是当前类的对象

当我们使用一个已经存在的对象作为参数,去初始化另一个对象的时候,编译器会调用拷贝构造

初始化是显式的调用拷贝构造

当使用对象进行值传递的时候,会发生隐式的调用拷贝构造

一、显式调用:使用已存在的对象初始化另一个对象

class Date
{
private:
	int _year;
	int _month;
	int _day;
public:
	Date(int year=0,int month=0,int day=0)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	Date(Date& d)            //这里必须使用引用,否则就会变成 值传递对象
	{
		cout << "拷贝构造函数被调用" << endl;
	}
};



int main() {
	Date d1;
	Date d2(d1);    //使用已经存在的d1对象初始化d2对象


	return 0;
}

二、隐式调用:值传递 调用拷贝构造函数

由于值传递会触发调用拷贝构造函数,这就是上面在定义拷贝构造函数的时候,形参必须添加引用的原因,否则会触发拷贝构造函数的无限调用

 1、参数 值传递

这里定义了一个 赋值运算符重载函数,参数使用的是 值传递

我们在类中新增下面的函数

void operator=(Date d)      //注意这里是 值传递
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
}

 稍微修改一下main函数,然后运行

int main() {
	Date d1;
	Date d2;
	d2 = d1;    //编译时会被转化为  d2.operator=(d1);

	return 0;
}

但是如果  void operator=(Date d)  改为  void operator=(Date& d)

此时就是引用传递,不会调用拷贝构造函数

 2、返回值  值传递

我们把上面的 赋值运算符重载函数 void operator=(Date& d) 改为下面的样子

Date operator=(Date& d)      //注意这里是 值传递
{
	_year = d._year;
	_month = d._month;
	_day = d._day;

    return *this;
}

main函数保持不变,然后运行

 同理 Date operator=(Date& d) 改为  Date& operator=(Date& d)

传值返回 改为 引用返回就能避免拷贝构造函数被调用

### 书生浦语大模型作业实现指南 #### 1. 环境配置与模型加载 为了完成与书生浦语大模型相关的作业,首先需要确保基础环境已正确配置。可以通过指定 `local_llm_path` 参数来加载本地模型文件夹路径或 Huggingface 上的模型名称,例如 `"internlm/internlm2-chat-7b"` 或 `"qwen/qwen-7b-chat-int8"` [^1]。此外,还需设置参数 `local_llm_max_text_length`,以定义模型可接受的最大文本长度。 对于具体操作步骤,可以参考如下 Python 示例代码: ```python from transformers import AutoTokenizer, AutoModelForCausalLM model_name_or_path = "internlm/internlm2-chat-7b" tokenizer = AutoTokenizer.from_pretrained(model_name_or_path) model = AutoModelForCausalLM.from_pretrained(model_name_or_path) max_input_length = model.config.max_position_embeddings print(f"Maximum input length supported by the model: {max_input_length}") ``` #### 2. 数据准备与微调策略 在实际应用中,可能需要对书生浦语大模型进行微调以适配特定任务需求。常见的微调方式包括 **增量预训练** 和 **指令跟随微调** [^3]。前者适用于引入新的领域知识(如行业术语、技术文档),后者则用于优化模型的对话能力。 以下是针对不同场景的数据准备建议: - 如果目标是提升模型的知识覆盖范围,则应收集相关领域的文章、书籍或其他结构化数据作为训练集; - 若旨在增强交互效果,则需构建高质量的人机对话样本集合。 #### 3. 功能开发实例——图文创作工具 利用书生浦语及其衍生版本(如浦语·灵笔2),开发者能够快速搭建具备先进图文生成能力的应用程序 [^2]。下面展示了一个简单的 CLI 接口设计思路,允许用户输入自定义主题并获得相应的文字描述及配套插图链接。 ```python def generate_article_with_images(prompt): response = model.generate( tokenizer.encode(prompt, return_tensors="pt"), max_new_tokens=500, num_beams=4, no_repeat_ngram_size=2 ) decoded_output = tokenizer.decode(response[0], skip_special_tokens=True) article_content, image_url_list = parse_response(decoded_output) # 自定义解析逻辑 return {"text": article_content, "images": image_url_list} if __name__ == "__main__": user_prompt = input("请输入您的创意方向:") result = generate_article_with_images(user_prompt) print(result["text"]) for idx, img_link in enumerate(result["images"]): print(f"[Image {idx+1}] URL: {img_link}") ``` > 注:以上仅为伪代码框架示意,请根据实际情况调整函数内部实现细节以及依赖库的选择。 #### 4. 常见问题分析与改进措施 尽管书生浦语系列表现出众,但在某些复杂查询情境下仍可能存在不足之处 [^5]。比如,当面对高度相似的信息源时,可能会倾向于优先选用最早录入的内容而忽略后续更新更优解的可能性。对此现象可通过以下方法缓解: - 扩展检索范围至整个数据库而非局限于前几条记录; - 结合外部搜索引擎动态补充实时资讯; - 定期维护知识库内容保持时效性和准确性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值