c++的构造函数
目录
构造函数
1.构造函数:
2.构造函数的特点:
默认构造函数 -- 没有参数的构造函数
1. 合成(自动)的默认构造函数(一般不常用)
1) 介绍,以及为什么不使用
2)可以使用合成默认构造函数的情况
2. 自定义的默认构造函数
1)介绍
有参构造函数 -- 带参数的构造函数
1. 自定义有参构造函数
1) 简述
2) 使用有参构造函数实例化对象
3)有参构造函数定义时需要注意:
1. 使用的参数名字和类内的属性名字不同
2. 使用的构造函数参数的名字和类内的属性名字一样
3. 解决办法: 使用this指针 :指向当前对象(可以理解为调用函数的这个对象)
拷贝构造函数
1. 合成的拷贝构造函数(有很大风险) -- 浅拷贝
1)简述 -- 浅拷贝
2)合成拷贝构造函数具有很大的风险(浅拷贝的风险)
2. 自定义的拷贝构造函数 -- 深拷贝
1)简述 -- 深拷贝
2)使用深拷贝来解决浅拷贝的问题
3)浅拷贝和深拷贝
4)拷贝构造函数的调用时机
返回过程:
5) 拷贝构造函数注意事项
赋值构造函数
合成的赋值构造函数
1)简述
2) 代码
3)合成赋值构造函数也存在问题 -- 也是浅拷贝
自定义的赋值构造函数
1)含义
2)代码
3)赋值构造函数的写法
总结:
构造函数
构造函数是c++类中的概念,用来给对象的属性进行初始化和一些其它的操作(相当于创造一个东西时,赋予它一些特性)。
1.构造函数:
其实从字面意思来理解,就是创造一个东西的函数,对于类来说这个东西就是对象。
所以,c++语法规定,在我们实例化一个类对象的时候,都会默认调用构造函数。
2.构造函数的特点:
1) 创建对象时自己调用
2) 没有返回值,函数名和类名一样
3) 可以利用函数的重载,写多个构造函数。
3. 注意:
构造函数必须设置为公有,因为我们实例化对象在类外,所以构造函数必须能够被外界使用。
默认构造函数 -- 没有参数的构造函数
1. 合成(自动)的默认构造函数(一般不常用)
1) 介绍,以及为什么不使用
我们上面说了,c++的语法规则:实例化一个对象就会自动调用构造函数。
但是如果我们没有在类中写构造函数呢? 那么编译器会默认给我们生成一个合成的默认构造函数。这个构造函数其实内部什么也没有,就是一个空函数。 那没什么要有它呢?-- 也许为了语法统一。
但是,使用合成的默认构造函数的风险很高。 看代码:
class Human {
public:int getAge();void visit();private:int age;
};int Human::getAge() {return this->age;
}void Human::visit() {cout << getAge() << endl;
}int main(void) {Human man; // 创建man对象man.visit(); // 使用visit函数来打印age的值system("pause");return 0;
}
上面代码,我们创建了一个对象,并且我们没有在类中实现构造函数,这是编译器会自己创建一个构造函数(空实现)。
我们通过visit()打印通过对外接口getAge()获得的age的值。-- 看上面的结果,是一个很大的负值。这中情况很常见 -- 没有赋值直接使用。
为什么会是上面的结果呢?
因为,对象man中的属性age,没有赋值,在实例化的时候,调用的也是编译器自己创建的默认构造函数,也是空实现,不会对age进行赋值,所以age在使用的时候是没有赋值的。所以会出现问题。
这就是为什么不使用它的原因了。
2)可以使用合成默认构造函数的情况
有一种情况,我们是可以使用默认构造函数的。
class Human {
public:int getAge();void visit();private:int age = 18; // 仅c++11之后可以
};
比如代码中,我们在类内定义的age变量,定义的时候已经初始化了。这时,即使再输出age也不会出现上面的情况(构造函数不赋值的情况下)。
正常输出。
所以,当我们类内的数据在定义的时候全都已经初始化了(必须全部初始化,因为有不初始化的就存在风险),就可以使用合成默认构造函数了。
注意: 只有c++11之后才支持在类内定义数据时,进行初始化。
2. 自定义的默认构造函数
1)介绍
上面说到,我们一般都不会使用合成默认构造函数,我们一般都会自己定义一个构造函数。
在自定义的构造函数中我们就可以对相应的数据进行初始化了。
class Human {
public:int getAge();void visit();Human();private:int age;
};int Human::getAge() {return this->age;
}Human::Human() {age = 18;
}void Human::visit() {cout << getAge() << endl;
}int main(void) {Human man; // 创建man对象man.visit(); // 使用visit函数来打印age的值system("pause");return 0;
}
上面代码,就定义了一个默认构造函数,Human(),我们在实现构造函数中,将age属性进行了初始化。
在自定义的构造函数中我们可以根据自己的需要进行设置,将相应的属性进行初始化。
注意: 当我们自己定义了构造函数的时候,编译器就不会给我们提供了。
有参构造函数 -- 带参数的构造函数
1. 自定义有参构造函数
1) 简述
前面提到构造函数可以有多个,带参数的构造函数是我们自己写的。 前面写的默认构造函数没有参数的。
有参构造函数:就是带参数的构造函数,所以它的书写规则和无参构造很类似,就是带了个参数。
class Human {
public:Human(int age, string name);int getAge();string getName();void visit();
private:int age;string name;
};int Human::getAge() {return this->age;
}string Human::getName() {return name;
}void Human::visit(){cout << getAge() << endl;cout << getName() << endl;
}Human::Human(int age, string name) {this->age = age; // 如果名字相同使用this指针,或者可以将参数的名字设置成不一样的this->name = name;
}int main(void) {Human man1(18, "男神");man1.visit();system("pause");return 0;
}
代码中:定义了一个有参构造函数:Human(int age,string name) ;
2) 使用有参构造函数实例化对象
代码中有参构造有两个参数,用来接收用户用来初始化属性的值。
所以在使用有参构造函数创建对象的时候,需要传入参数。Human man1(18,"男神"); 就是调用有参构造函数进行创建对象。
3)有参构造函数定义时需要注意:
1. 使用的参数名字和类内的属性名字不同
class Human {
public:// 有参构造函数Human(int age1, string name1);
private:int age;string name;
};Human::Human(int age1, string name1) {age = age1;name = name1;
}
当有参构造函数的参数名字和类内属性名,名字不一样的时候,可以直接进行赋值。
2. 使用的构造函数参数的名字和类内的属性名字一样
class Human {
public:// 有参构造函数Human(int age, string name);
private:int age;string name;
};Human::Human(int age, string name) {age = age; // 此时这两个age都表示的是参数,所以不正确。name类似name = name;
}
当参数的名字和属性名字相同的时候,就不能直接赋值了。
age = age; // 此时这两个age都表示的是形参里面的age,并不是类内属性的age,所以不对。
3. 解决办法: 使用this指针 :指向当前对象(可以理解为调用函数的这个对象)
Human::Human(int age, string name) {this->age = age; this->name = name;
}
使用this之后,就可以了。 因为this指向当前对象,所以this->age就是指当前对象的age属性。
拷贝构造函数
拷贝构造函数:在一个对象初始化的时候,给它赋值另外一个对象,这是就会默认调用拷贝构造函数。
Human man2 = man1;
1. 合成的拷贝构造函数(有很大风险) -- 浅拷贝
1)简述 -- 浅拷贝
合成的拷贝构造函数就是:当自己没有实现拷贝构造函数的时候,编译器会自动生成一个合成拷贝构造函数。
拷贝构造函数会将man1中属性的值拷贝到man2的属性中。
2)合成拷贝构造函数具有很大的风险(浅拷贝的风险)
浅拷贝:就是只将属性的值,拷贝到另外一个对象。
这样看,浅拷贝好像没有什么问题。如果使用普通的变量,没有什么问题,但是如果属性中指针,那么就会出现问题。
举个例子:
int age;
string name;
char *a;man1 : age=12,name="帅哥",*a = 'a'Human man2 = man1;
将man1中的值拷贝到man2中, 我们没有定义拷贝构造函数,所以编译器自动生成,进行浅拷贝: 将man1 中 age 的值复制给 man2中 age,name也同理,
重点来看指针的拷贝:浅拷贝只是将指针变量a中存放的地址拷贝到man2的a中,也就是说进行浅拷贝之后,man1中的a和man2中的a指向同一片内存,同一块数据。
可能会疑问问什么不能指向同一个呢? -- 很简单,man1 和 man2两个对象毫不相关,如果这个指针用来表示的是资产,那你说,两个人的资产怎么能放到一起呢。
所以这样用一定会出问题,会有很大的风险。
2. 自定义的拷贝构造函数 -- 深拷贝
1)简述 -- 深拷贝
前面说到,系统自动提供的拷贝构造函数只能进行浅拷贝,会造成很大的风险。
那怎么办呢?-- 那就自己实现一个呗,然后使用深拷贝来解决这个问题
2)使用深拷贝来解决浅拷贝的问题
浅拷贝的问题是: 对指针进行拷贝时,不会开辟新空间,直接将新对象的指针指向别的对象的内存,这就会造成很大的风险。
问:那深拷贝如何解决这个问题呢?
我们可以在自己实现的拷贝构造函数中,给新对象的指针开辟一片空间,来存放其他对象指针中的值 -- 这样就不会共用同一片空间了。
class Human {
public:Human();Human(const Human&); // 函数声明可以不写参数名称
private:int age;string name;char* f1;
};Human::Human() {age = 20;name = "帅哥";f1 = new char[10];strcpy_s(f1,10,"好好学习"); // 使用字符串拷贝给字符串进行赋值
}Human::Human(const Human& man) {age = man.age;name = man.name;f1 = new char[10];strcpy_s(f1, 10, man.f1); // 将man中f1指向内存的值拷贝到此对象的f1中
}int main(void) {Human man1;Human man2 = man1; // 在对象初始化时赋值给另外一个对象,则会默认调用拷贝构造函数system("pause");return 0;
}
Human(const Human&); 就是我们自定义的拷贝构造函数声明。
在函数实现的过程中, 我们又为新对象的f1指针创建了一片内存,用来存放其它对象的值。
3)浅拷贝和深拷贝
浅拷贝:系统自己生成的拷贝构造函数,只是将变量中的值浅浅的复制过去,不管你是不是有风险, 比如:对于指针变量,只是将指针变量存放的地址复制过去,使它指向了同一片空间。
深拷贝: 为了解决浅拷贝带来的风险,我们需要自己实现拷贝构造函数,为新对象的指针开辟空间,将别的对象指向的内容复制过去,而不是简单的将指针中存储的地址复制过去。
4)拷贝构造函数的调用时机
1. 当函数参数不是引用(值传递),参数类型是我们定义的类的时候
void test(Human man) { // 传参数的过程就是 Human man = man1 这不就是拷贝构造// 测试语句
}int main(void) {Human man1;test(man1);system("pause");return 0;
}
2. 返回值为我们定义的类
Human test(Human& man) {// 测试语句return man;
}int main(void) {Human man1;test(man1);system("pause");return 0;
}
返回过程:
其实就是创建一片临时空间来存放man的值,然后返回给主调函数。 这个过程其实和Human man1 = man;是类似的,只是此处我们不知道变量名称。
3. 初始化对象时,直接使用另外一个对象初始化,使用=或者()都可以。都会自动调用拷贝构造函数。
int main(void) {Human man1;Human man2 = man1; // 在对象初始化时赋值给另外一个对象,则会默认调用拷贝构造函数Human man3(man1);system("pause");return 0;
}
4. 使用对象数组初始化的时候
int main(void) {Human man1;Human man2 = man1; Human man3(man1);Human man4[3] = { man1,man2,man3};system("pause");return 0;
}
其实就是定义了一个数组,数组中的每个元素都是Human类型,所以其实就相当于:
Human man4[0] = man1; Human man4[1] = man2; Human man4[2] = man3; 自动调用拷贝构造函数。
5) 拷贝构造函数注意事项
1. 拷贝构造函数的参数类型必须是: const Human& man 这种
2. 拷贝构造函数的参数只能有一个,因为初始化的时候,只能一个对象作为右值。
3. 由于2.,所有拷贝构造函数只能有一个,因为它无法进行函数重载,因为它只能有一个参数,并且参数的类型和数量都是固定的。 (有参构造可以重载,因为参数个数个类型不受限制)
赋值构造函数
合成的赋值构造函数
1)简述
赋值构造函数和其他的构造函数不同(具体看实现)。 合成赋值构造函数也是系统自己提供
2) 代码
int main(void) {Human man1,man2;man2 = man1; // 在不初始化时,进行赋值,调用赋值构造函数system("pause");return 0;
}
当我们使用=将一个对象赋值给另外一个对象的时候,系统会自动调用赋值构造函数。(注意:不是初始化的时候,初始化时调用的是拷贝构造函数)
3)合成赋值构造函数也存在问题 -- 也是浅拷贝
还是浅拷贝,当属性中有指针时,虽然两个对象的指针都指向各自的内存,但是合成赋值构造函数只是进行简单的赋值,对指针进行赋值时,只是将指针变量的值赋值给新对象的指针,这样又会导致两个对象的指针直系那个同一片内存。(浅拷贝)
自定义的赋值构造函数
1)含义
和上面一样,既然浅拷贝有问题,那么我们就自定义一个赋值构造函数来实现深拷贝。
2)代码
class Human {
public:Human();Human& operator=(const Human& man); // 赋值构造函数 -- =运算符重载
private:int age;string name;char* f1;
};Human::Human() {age = 20;name = "帅哥";f1 = new char[10];strcpy_s(f1,10,"好好学习"); // 使用字符串拷贝给字符串进行赋值
}Human& Human::operator=(const Human& man) {age = man.age;name = man.name;// 深拷贝strcpy_s(f1, 10, man.f1);return *this; // 返回此对象
}int main(void) {Human man1,man2;man2 = man1; // 在不初始化时,进行赋值,调用赋值构造函数system("pause");return 0;
}
问:为什么此处的深拷贝不需要开辟新空间?
此处的深拷贝,已经不需要开辟空间了,因为我们在实例化对象的时候 ,已经在默认构造函数中,对每个对象的f1指针都开辟了单独的空间。所以,不需要再开辟空间了。
我们只需要将man1中的f1内存中的值拷贝到man2的f1指向的内存即可。(而不是,将f1中的地址赋值过去)。
3)赋值构造函数的写法
1. 首先赋值构造函数就是一个=的重载函数
2. 参数传入的是作为=右值的对象,而调用函数的是=左值的对象。(this指针指向当前对象 )
3. 返回Human&, 是用来返回调用函数的对象的。this指向调用函数的当前对象,*this就是此对象。
4. 3.的原因: 为了能够实现连续赋值的情况 -- man = man1 = man2;
man1 = ma2; 调用赋值构造函数,返回man1, 再进行 man = man1。
总结:
综合上面的看,构造函数其实就是,当我们对对象进行相应的操作时,系统会自动去调用的函数。为了构造当前对象,去调用函数。
相关文章:

c++的构造函数
目录 构造函数 1.构造函数: 2.构造函数的特点: 默认构造函数 -- 没有参数的构造函数 1. 合成(自动)的默认构造函数(一般不常用) 1) 介绍,以及为什么不使用 2)可以使用合成默认构造函数的情况 2. 自定义的默认…...

基于ZU19EG的100G-UDP解决方案
概述 本文档介绍ZU19EG与Mellanox CX6 100G网卡通信解决方案。 环境配置 FPGA硬件:519-ZU19EG的4路100G光纤PCIe加上计算卡 电脑:国产国鑫主板(双PCU):Gooxi G2DA-B CPU:Intel Xeon Silver 2.2GHz 内存࿱…...

行为型设计模式——备忘录模式
备忘录模式 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,很多软件都提供了撤销(Undo)操作…...

自定义HBase负载均衡器MyCustomBalancer实现步骤与代码解析
目录 1.HBase默认负载均衡策略 1.1 负载均衡总体流程 1.2 不能触发负载均衡的情况 1.3 负载均衡算法 2.自定义的 HBase 负载均衡器的步骤 3.MyCustomBalancer的代码细节 3.1 balanceCluster 方法的作用 3.2balanceCluster 对数据的影响 3.3监控HBase的性能指标 3.3.…...

企业网站建设中常用的英文翻译
下面好代码网在长期的网站建设业务中总结的,一些在企业网站建设中词语的常用翻译,可以让你的企业网站更具有专业性。如果你做中英文双语版本网站或者外贸网站的请收藏备用。 网站导航 site map 公司简介 PROFILE or COMPANY Profile or Company 综述 Gen…...

vscode运行Python的两种方法,及无法运行的原因
vscode运行Python代码 下面介绍的vscode运行Python代码的方法基于的一个前提条件是:当前的计算机已经安装好了Python,且已经配置好了相关的环境变量。如果要查看是否已经都安装好了,可以打开Windows系统的命令行工具Windows PowerShell&…...

【猫头虎分享】全面揭秘鸿蒙4.0:华为的技术革新与市场影响
博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…...

Java内存模型之可见性
文章目录 1.什么是可见性问题2.为什么会有可见性问题3.JMM的抽象:主内存和本地内存3.1 什么是主内存和本地内存3.2 主内存和本地内存的关系 4.Happens-Before原则4.1 什么是Happens-Before4.2 什么不是Happens-Before4.3 Happens-Before规则有哪些4.4 演示ÿ…...

【docker】Docker Compose 使用介绍
一、什么是Docker Compose Docker Compose是一个用于定义和运行多个Docker容器的工具。它允许您使用YAML文件来配置应用程序的服务、网络和卷等方面,并通过单个命令即可快速启动和停止整个应用程序的多个容器。 Docker Compose的主要作用如下: 管理多个…...

uniapp怎么开发插件并发布
今天耳机坏了,暂时内卷不了,所以想开发几个插件玩玩,也好久没写博客了,就拿这个来写了 首先,发布插件时需要你有项目 这里先拿uniapp创建一个项目, 如下,创建好的项目长这样 然后根据uniapp官网上说的,我们发布插件时,需要在uni_modules里面编写和发布 ps:还需要使用uniapp…...

为什么不直接public,多此一举用get、set,一文给你说明白
文章目录 1. 封装性(Encapsulation)2. 验证与逻辑处理3. 计算属性(Computed Properties)4. **跟踪变化(Change Tracking)5. 懒加载与延迟初始化(Lazy Initialization)6. 兼容性与未来…...

golang 记录一次协程和协程池的使用,利用ants协程池来处理定时器导致服务全部阻塞
前言 在实习的项目中有一个地方遇到了需要协程池的地方,在mt推荐下使用了ants库。因此在此篇记录一下自己学习使用此库的情况。 场景描述 此服务大致是一个kafka消息接收、发送相关。接收消息,根据参数设置定时器进行重发。 通过这里新建kafka服务&a…...

【Postman-windows-9.12.2版本安装与汉化】
Postman-windows-9.12.2版本安装与汉化 想用英文版本的可以直接点击如下链接下载最新版本 官网最新版本(无法汉化):https://www.postman.com/downloads/ 如果想要汉化的就不能使用最新版本,因为最新版本没有汉化包可以用 汉化包和postman的版本必须是…...

11Spring IoC注解式开发(下)(负责注入的注解/全注解开发)
1负责注入的注解 负责注入的注解,常见的包括四个: ValueAutowiredQualifierResource 1.1 Value 当属性的类型是简单类型时,可以使用Value注解进行注入。Value注解可以出现在属性上、setter方法上、以及构造方法的形参上, 方便起见,一般直…...

Grafana Promtail 配置解析
由于目前项目一般都是部署在k8s上,因此这篇文章中的配置只摘录k8s相关的配置,仅供参考,其他的配置建议上官网查询。 运行时打印配置 -print-config-stderr 通过 ./promtail 直接运行Promtail时能够快速输出配置 -log-config-reverse-order 配…...

电脑DIY-主板参数
电脑主板参数 主板系列芯片组主板支持的CPU系列主板支持CPU的第几代主板的尺寸主板支持的内存主板是否支持专用WIFI模块插槽主板规格主板供电规格M.2插槽(固态硬盘插槽)规格USB接口规格质保方式 华硕TUF GAMING B650M-PLUS WIFI DDR5重炮手主板 华硕&…...

JVM知识总结(持续更新)
这里写目录标题 java内存区域程序计数器虚拟机栈本地方法栈堆方法区 java内存区域 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域: 程序计数器虚拟机栈本地方法栈堆方法区 程序计数器 记录下一条需要执行的虚拟机字节码指令…...

信息系统安全——基于 KALI 和 Metasploit 的渗透测试
实验 2 基于 KALI 和 Metasploit 的渗透测试 2.1 实验名称 《基于 KALI 和 Metasploit 的渗透测试》 2.2 实验目的 1 、熟悉渗透测试方法 2 、熟悉渗透测试工具 Kali 及 Metasploit 的使用 2.3 实验步骤及内容 1 、安装 Kali 系统 2 、选择 Kali 中 1-2 种攻击工具,…...

05. 深入理解 GPT 架构
在本章的前面,我们提到了类 GPT 模型、GPT-3 和 ChatGPT 等术语。现在让我们仔细看看一般的 GPT 架构。首先,GPT 代表生成式预训练转换器,最初是在以下论文中引入的: 通过生成式预训练提高语言理解 (2018) 作者:Radford 等人,来自 OpenAI,http://cdn.openai.com/rese…...

PHP开发日志 ━━ php8.3安装与使用组件Xdebug
今天开头写点历史: 二十年前流行asp,当时用vb整合常用函数库写了一个dll给asp调用,并在此基础上开发一套仿windows界面的后台管理系统;后来asp逐渐没落,于是在十多年前转投php,不久后用php写了一套mvc框架&…...

Python - 深夜数据结构与算法之 Two-Ended BFS
目录 一.引言 二.双向 BFS 简介 1.双向遍历示例 2.搜索模版回顾 三.经典算法实战 1.Word-Ladder [127] 2.Min-Gen-Mutation [433] 四.总结 一.引言 DFS、BFS 是常见的初级搜索方式,为了提高搜索效率,衍生了剪枝、双向 BFS 以及 A* 即启发式搜索…...

langchain-Agent-工具检索
有时会定义很多工具,而定义Agent的时候只想使用与问题相关的工具,这是可以通过向量数据库来检索相关的工具,传递给Agent # Define which tools the agent can use to answer user queries search SerpAPIWrapper() search_tool Tool(name …...

猫头虎分享:探索TypeScript的世界 — TS基础入门
博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…...

Unity-生命周期函数
目录 生命周期函数是什么? 生命周期函数有哪些? Awake() OnEnable() Start() FixedUpdate() Update() Late Update() OnDisable() OnDestroy() Unity中生命周期函数支持继承多态吗? 生命周期函数是什么? 在Unity中&…...

SQL概述及SQL分类
SQL由IBM上世纪70年代开发出来,是使用关系模型的数据库应用型语言,与数据直接打交道。 SQL标准 SQL92,SQL99,他们分别代表了92年和99年颁布的SQL标准,我们今天使用的SQL语言依旧遵循这些标准。 SQL的分类 DDL:数据定…...

[VSCode] VSCode 常用快捷键
文章目录 VSCode 源代码编辑器VSCode 常用快捷键分类汇总01 编辑02 导航03 调试04 其他05 重构06 测试07 扩展08 选择09 搜索10 书签11 多光标12 代码片段13 其他 VSCode 源代码编辑器 官网:https://code.visualstudio.com/ 下载地址:https://code.visua…...

函数指针和回调函数 以及指针函数
函数指针(Function Pointer): 定义: 函数指针是指向函数的指针,它存储了函数的地址。函数的二制制代码存放在内存四区中的代码段,函数的地址它在内存中的开始地址。如果把函数的地址作为参数,就…...

京东年度数据报告-2023全年度游戏本十大热门品牌销量(销额)榜单
同笔记本市场类似,2023年度游戏本市场的整体销售也呈下滑态势。根据鲸参谋电商数据分析平台的相关数据显示,京东平台上游戏本的年度销量累计超过350万,同比下滑约6%;销售额将近270亿,同比下滑约11%。 鲸参谋综合了京东…...

秒懂百科,C++如此简单丨第十二天:ASCLL码
目录 必看信息 Everyday English 📝ASCLL码是什么? 📝ASCLL码表 📝利用ASCLL码实现大写转小写 📝小试牛刀 总结 必看信息 ▶本篇文章由爱编程的小芒果原创,未经许可,严禁转载。 ▶本篇文…...

Qt6入门教程 4:Qt Creator常用技巧
在上一篇Qt6入门教程 3:创建Hello World项目中,通过创建一个Qt项目,对Qt Creator已经有了比较直观的认识,本文将介绍它的一些常用技巧。 Qt Creator启动后默认显示欢迎页面 创建项目已经用过了,打开项目也很简单&#…...