当前位置: 首页 > news >正文

C++ / Linux 学习 Day 2:引用、拷贝构造 与 auto.sh 自动编译脚本

日期:2025 年 10 月 31 日
学习主题:现代 C++ 语法进阶 + Linux 环境熟悉
今日关键词:引用、拷贝构造、浅拷贝与深拷贝、auto.sh 自动化脚本

一、现代 C++ 语法进阶

1. 左值引用与常量引用

 代码示例
#include <iostream>
#include <string>
using namespace std;void print(const string &s) {cout << "打印: " << s << endl;
}int main() {string str = "Hello";print(str);      // 传左值print("World");  // 传右值(通过 const 引用延长生命周期)
}
 理解要点:
  • 左值引用 (T&):绑定到有名字、可取地址的变量。

  • 常量引用 (const T&):可以绑定到临时对象(右值),并延长临时对象生命周期

  • "World" 本是右值,不能直接绑定到普通引用上,但 可以绑定到 const 引用,因此合法。

常见错误

一开始报了很多奇怪的链接错误:

undefined reference to `std::cout' ...

原因是:

 使用了 gcc 来编译 C++ 代码。

解决方法:

改用 g++

g++ cite.cpp -o cite

gcc 是 C 编译器,
g++ 才会自动链接 C++ 的标准库(std)。

2. 函数参数传递方式

练习内容

实现三个版本的 swap

  • 值传递

  • 引用传递

  • 指针传递

理解差异:

方式是否改变实参效率
值传递不会改变原值较慢
引用传递直接操作原变量推荐
指针传递可为空指针稍复杂

3.构造函数与析构函数

代码示例
#include <iostream>
using namespace std;class Point {
public:int x, y;Point() : x(0), y(0) { cout << "默认构造" << endl; }Point(int x, int y) : x(x), y(y) { cout << "有参构造" << endl; }~Point() { cout << "析构" << endl; }
};int main() {Point a;       // 默认构造Point b(3, 4); // 有参构造Point c(b);    // 拷贝构造(编译器自动生成)
}
理解要点:
  • 即使你不写拷贝构造,编译器也会自动生成一个 浅拷贝版本

  • 所以:

    Point e = b;
    

    会自动调用隐式拷贝构造函数,并复制成员变量值。

出错反思:

“为什么我注释掉拷贝构造函数之后还能拷贝?”

 因为编译器会自动合成一个默认拷贝构造函数,
行为是成员逐一复制(浅拷贝)。

4. 深浅拷贝区别

实验代码
#include <iostream>
#include <cstring>
using namespace std;class MyString {
private:char* data;
public:MyString(const char* str = "") {cout << "构造: " << str << endl;data = new char[strlen(str) + 1];strcpy(data, str);}// 深拷贝MyString(const MyString& other) {cout << "拷贝构造" << endl;data = new char[strlen(other.data) + 1];strcpy(data, other.data);}~MyString() {cout << "析构: " << data << endl;delete[] data;}
};
输出分析
构造: hello
拷贝构造
析构: hello
析构: hello

如果不用深拷贝,会出现 重复释放内存(double free) 错误。

解决方案

1. 改写拷贝构造函数为“深拷贝”;
2.或使用智能指针 shared_ptr<char[]> 管理资源;
3. 移动构造时要把源指针置 nullptr,防止析构时重复释放。

5. 运算符重载与 this 指针

示例:赋值运算符重载
Vec2& operator=(const Vec2& rhs) {if (this != &rhs) {   // 防止自赋值x = rhs.x;y = rhs.y;}return *this;         // 返回当前对象的引用
}
理解:
  • this → 指向左操作数对象;

  • rhs → 右操作数;

  • return *this 让语句支持链式调用 a = b = c;

验证:
cout << &a << endl;
cout << &b << endl;

打印结果中,this == &arhs == &b

二、Linux 环境熟悉

1. 基本命令回顾

命令功能
cd切换目录
ls -l查看文件详细信息
mkdir新建目录
rm -rf删除文件/目录
chmod +x添加可执行权限
./file执行程序

2.Shell 脚本 auto.sh

最终脚本
#! /bin/bash# 检查当前目录是否有 .cpp 文件
if [ ! -e *.cpp ]; thenecho " 没有找到任何 .cpp 文件!"exit 1
fi# 清理旧的可执行文件
if [ -f main ]; thenecho "clear"rm -f main
fiecho "bianyi"
g++ *.cpp -o mainif [ $? -eq 0 ]; thenecho "success"./main
else echo "failture"
fi
功能说明
符号 / 命令含义
-f文件是否存在且为普通文件
-e文件是否存在(文件或目录均可)
$?上一条命令的返回值(0 表示成功)
-eq判断数值是否相等
rm -f强制删除文件,不提示
chmod +x给脚本添加可执行权限
运行效果
clear
bianyi
success
Hello Linux!

出错与解决记录

错误信息原因解决方法
Permission denied文件没有执行权限chmod +x auto.sh
syntax error near unexpected token 'then'缺少空格,如 if[! -f main.cpp];then改成 if [ ! -f main.cpp ]; then
undefined reference to std::coutgcc 编译 C++改用 g++
collect2: error: ld returned 1 exit status链接失败(少加源文件)改成 g++ *.cpp -o main

三、学习成果总结

掌握了:

  • 左值 / 右值 / 常量引用 的使用场景;

  • 构造函数、拷贝构造、析构函数的执行顺序;

  • 深拷贝与浅拷贝区别;

  • 运算符重载的原理与 this 指针;

  • Linux 文件系统与权限命令;

  • Shell 条件判断与自动化脚本。

实战完成:

  • auto.sh 自动化编译运行脚本;

  • 成功运行多文件项目;

  • 熟悉终端命令 + vim 编辑。

http://www.dtcms.com/a/555202.html

相关文章:

  • 站长统计工具山西网站建设网站
  • 国外网站需要备案郴州百度seo
  • 北京孤儿院做义工网站三大电商平台
  • 关键词优化排名网站php企业网站开发实验总结
  • 网站安全 维护广东省工程招投标信息网
  • 米拓建站模板开发网站的可行性
  • 广州门户网站黑龙江网站建设巨耀网络
  • php网站安装图解微软的网站开发软件
  • 一般设计网站页面用什么软件梵克雅宝什么档次
  • wordpress不支持pdowin11优化大师
  • 门户网站建设意见男女做暖暖的时候网站
  • 网站建设的六个步骤网页版梦幻西游火眼金睛
  • 这样建立自己的网站WordPress付费阅读文章
  • 郑州网站开发公司名称大全wordpress和seo权重
  • 完整企业网站模板网站后台管理系统制作软件
  • 青山湖网站建设wordpress load.php
  • 如何选择个人网站主题html教学网站
  • 专业手机网站建设价格明细表2023年的新闻十条
  • 佛山微信网站推广多少钱男女的做那个视频网站
  • 网站开发和美工的区别网页制作公司文案
  • 机械配件东莞网站建设河口建设局网站
  • 江门网站建设哪家好学校网站建设企业
  • 建设旅游网站数据库设计树莓派lamp WordPress
  • 内丘网站建设简约风格的网站
  • 做网站时无法上传图片投票网站建设
  • 进销存管理上新!Tigshop开源商城系统 JAVA v5.7.0正式发布!
  • 养殖类网站模板和建设银行类似的网站
  • 网站建设 国外深圳动漫制作
  • 类似k站的网站网站 备案 拍照
  • 阜新网站建设互联网家装公司