尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

C++的构造函数和用法

发布时间:2026/9/29 21:18:03

资讯中心
01
ARTICLE

C++的构造函数和用法

C++的构造函数和用法
1.构造函数是什么构造函数负责为类的成员进行初始化并完成一系列其他相关功能。构造函数可以放在类里面和类外面格式不同而已类声明结束后像结构体一样创建变量也就是对象的时候会先调用一次构造函数然后创建对象并且是必须调用构造函数既然类创建对象必须先调用构造函数那岂不是类里面必须要有构造函数是的就算一个类里面没有写构造函数编译器会自动帮你写一个默认构造函数那么为什么C要创建对象前要调用一次函数呢这不是多此一举很奇怪吗我们先看场景构造函数是在创建对象之前调用那么肯定是预防对象的成员在创建之后遇到的问题构造函数干脆在他们创建之前直接解决了比如在栈空间创建对象对象的变量成员是垃圾值用构造函数在创建他们之前进行初始化和赋值就避免他们在栈空间创建后出现垃圾值的问题可是我有感觉有时候构造函数没有初始化或者赋值感觉非常得多此一举这种感觉是对的因为构造函数不会强制你进行初始化和赋值或者进行某个操作导致这个构造函数没有发挥作用是这样的C也允许这样当你的类很简单成员都是 int、char 这种基础类型初始化只是简单清零。这种场景 C 会给你隐式默认构造函数你不写代码编译器自动生成你感知不到它的存在。一旦你的类有动态内存、文件句柄等资源构造函数的价值立刻体现。构造函数需要自己去自定义里面的参数列表和代码块默认函数也算自定义函数的一种只不过参数和代码块都是空没有影响而已自定义构造函数就是在类里面按着自己的想法给成员初始化默认构造函数就是你不写构造函数的时候编译器自己帮你写的构造函数的函数格式非常特殊构造函数一般放在public里面构造函数在类内部有权访问本类所有成员不管是 public 公有还是 private 私有构造函数的语法格式自定义构造函数语法格式自定义构造函数不能写返回值类型函数名就是类名参数列表可以有参数也可以没有类名(int a,int b) //构造函数强制必须没有返回值类型不能写void{ //构造函数的函数名就是对应类名成员1初始化;成员2初始化;}默认构造函数语法格式默认构造寒素的语法格式就是没有参数和代码块内容的自定义构造函数类名() //默认函数不能有参数和代码块内容{}当你不写构造函数的时候编译器自动帮你写默认构造函数当然你也可以自己按着标准写默认构造也可以默认构造函数包括编译器自动帮你写的和你自己按着标准写的构造函数的分类构造函数分为有参数构造函数无参数构造函数默认构造函数有参数里面又有拷贝构造函数我还喜欢把构造函数分为自定义构造函数和非自定义构造函数自定义构造函数主要是用来判断类是不是聚合类这样类可不可以用结构体间接定义变量花括号初始化的方法初始化聚合类只能直接在声明处花括号后面定义变量构造函数用法构造函数总共六种用法用法1:构造函数无参数当然默认构造函数也没有参数class student{publicint age int snostudent();{age10; //自定义构造函数给成员赋值sno10086;namebllue; //构造函数的功能给公有和私有都可以cout //自定义构造函数也可以完成一系列其他的功能}privatestring name;int func(){coutreturn 0;}}int main(){student a; //此时只要类创建了对象对应构造函数就调用了 所以此时已经赋值和打印cout了//类创建对象的格式是按照构造函数这里构造函数没有参数就变量名后面没括号就行//但是构造函数没有参数调用时候可以不写括号其他函数调用没有参数还是要写括号//当然变量名后面没括号也可以是默认构造函数因为他也没有括号//此时完成类的对象创建就是像结构体的间接定义变量结构体数据类型多一个关键字structreturn 0;}用法2:构造函数有参数有参数时候自然没有默认构造函数了class student{publicint age int snostudent(int a,string b); //此时构造函数里面有参数函数有参数无非就只是用参数的值罢了{agea; //自定义构造函数给成员赋值sno10086;nameb;cout //自定义构造函数也可以完成一系列其他的功能}privatestring name;int func(){coutreturn 0;}}int main(){studnet a(18,red); //类创建对象并非一尘不变类创建对象的格式是按照构造函数的格式//类创建对象就是调用构造函数把变量名想象成构造函数名有参数就后面写括号按着实参传参就行return 0;}用法3:构造函数重载构造函数也遵循函数重载所以构造函数重载是函数名相同参数列表不同构造函数重载就是一个类里面可以不止有一个构造函数可以有参数可以没有参数放多个构造函数必须遵循函数重载构造函数的灵魂就是函数名多个构造函数书写时候还是按着原来语法格式不用去区分class student{publicint age int snostudent(int a); //此时第一个构造函数里面有参数{agea;sno10086;nameb;cout}student(int cc,string dd); //此时第二个构造函数里面也有参数{agec;sno10086;named;cout}student() //此时第三个构造函数没有参数{age100;sno10086;namebluecout}privatestring name;int func(){coutreturn 0;}}int main(){studnet a(18,red); //类创建对象并非一尘不变类创建对象的格式是按照构造函数的格式//类创建对象就是调用构造函数把变量名想象成构造函数名有参数就后面写括号按着实参传参就行studnet a(18,red); //此时就是调用第二个构造函数输出第二个构造函数的代码student a(20); //此时就是调用第二个构造函数输出第二个构造函数的代码return 0;}用法4:构造函数放在类外面构造函数放在类外面语法格式会不一样构造函数虽然强制不能写void但其实还是一个函数不能看作不是函数了我们平时写构造函数都是写她的函数定义构造函数放在类外面只有两个位置第一个是main函数上面就是原本类的下面第二个是main函数的下面构造函数放在main函数上面构造函数又是函数定义自然主函数调用没有问题但是构造函数放在main下面先是main构造函数调用肯定不可以函数调用之前必须声明或者定义此时构造函数函数定义放在main下所以类里面必须写这个构造函数的声明(1)构造函数放在类外面但在main函数上面最常用class student{publicint age int snoprivatestring name;int func(){coutreturn 0;}}student::student(int a,string b) //其实就是类在外面访问自己的函数而已只不过这个函数刚好是函数定义{ //此时这个就是函数定义ageastring”blue;}int main(){studnet a(18,red); //其余一样还是该传参就传参 //此时这个就是函数调用return 0;}(2)构造函数放在类外面但在main函数上面最常用class student{publicint age int snostudent(int a,string b); //构造函数的声明构造函数的声明最好放公有//因为构造函数声明放私有外面访问不到这个构造函数的声明自然不能调用//类创建对象必须构造函数可以调用构造函数调用不了类无法创建对象privatestring name;int func(){coutreturn 0;}}int main(){studnet a(18,red); //其余一样还是该传参就传参return 0;}student::student(int a,string b) //此时函数定义放在函数调用后面{ageastring”blue;}用法5:构造函数搭配初始化列表初始化 推荐重点就是在构造函数括号右边加一个初始化列表但是这个初始化列表初始化的值只能是参数里面的值初始化列表在构造函数函数体 {} 执行之前完成成员初始化比函数体内赋值效率更高优先级更早。但函数体里面的赋值还是能改变最终的值初始化列表的变量初始化顺序不是看参数是看对应定义变量的顺序类里面不区分公有私有初始化列表的变量里面可以有私有还是按着从上到下的顺序就行#includeiostream #includestring using namespace std; class student { public: int age; //这里才是定义变量的顺序这里是先age再name初始化列表也要按照这个顺序 int sno; int func() { couthello worldendl; return 0; } //初始化列表的变量初始化顺序必须是定义变量的顺序 student(int a,string b):age(a),name(b) //此时是用初始化列表初始化age的值只能拿形参里的a的值name的值是b { //此时函数体不用再初始化了如果函数体有赋值赋值会覆盖上面的初始化 //age30//此时age还是等于30赋值会覆盖上面的初始化 couthello world1endl; coutageageendl; coutnamenameendl; } private: string name; }; int main() { student a1(10,red); return 0; }student(int a,string b):age(a),name(b) //:age(a),name(b) 就叫初始化列表这里是初始化,定义变量可以和初始化分开这里的//变量没有等于符号就是初始化{ //此时函数体不用再初始化了如果函数体有赋值赋值会覆盖上面的初始化//age30//此时age还是等于30赋值会覆盖上面的初始化cout cout cout}用法6:构造函数是默认参数搭配初始化列表初始化 推荐重点当遇到参数是默认参数时候函数调用语法格式要变化student(int a30,string bblue):age(a),name(b) //就是长这样的实参如果没改变形参那么初始化就是形参值{//age30//此时age还是等于30赋值会覆盖上面的初始化cout cout cout}int main(){//函数有默认参数调用函数的三种方式这里的默认参数格式是和创建对象一起的student s1 //默认参数没括号表示是默认的不是代表没有参数student s2(10); //默认参数里面实参的值优先级大于形参默认值student s3(10,red);return 0;}
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。