3.21 黑马提高
构造函数调用规则
默认情况下,C++编译器至少给类添加3个函数
1、默认构造函数(无参,函数体 为空);
2、默认析构函数(无参,函数体 为空);
3、默认拷贝构造函数,对属性进行值拷贝。
1、如果用户定义有参构造函数,C++不再提供默认无参构造函数,但会提供默认拷贝构造函数;
2、如果用户定义拷贝构造函数,C++不会再提供其他构造函数。
拷贝构造函数的使用规则
include
using namespace std;
class to
{
public:
to()
{
printf("构造\n");
}
~to()
{
printf("析构\n");
}
to(const to& q)
{
printf("拷贝构造\n");
}
};
void func(to a)
{
}
void test2()
{
//已有的对象去初始化另一个对象
to we;
to t1(we);
}
to func2()
{
//局部对象
to z;
return z;
}
int main()
{
func2();
}
2.多个对象的析构 和构造
include
using namespace std;
class to1
{
public:
to1(int a)
{
printf("构造1\n:%d",a);
}
~to1()
{
printf("析构1\n");
}
to1(const to1& q)
{
printf("拷贝构造1\n");
}
};
class to2
{
public:
to2(int c)
{
printf("构造2\n");
}
~to2()
{
printf("析构2\n");
}
to2(const to2& q)
{
printf("拷贝构造2\n");
}
};
class to3
{
public:
to3():eq(3), e(4)
{
printf("拷贝构造3\n");
}
to2 e;
to1 eq;
};
int main()
{
to3 eqq;
}
3.深浅拷贝
浅拷贝
include
using namespace std;
class to
{
public:
int c=0;
to(int a)
{
c = a;
printf("构造1\n:%d",c);
}
~to()
{
printf("析构1\n");
}
};
int main()
{
to eqq(3);
to eqq2(eqq);
}
默认拷贝问题
class to
{
public:
int c=0;
char* pname;
to(const char* a,int age)
{
c = age;
pname = (char*)malloc(strlen(a) + 1);
strcpy(pname, a);
printf("构造:%d %s\n",c, pname);
}
~to()
{
if (pname != NULL)
{
free(pname);
pname = NULL;
}
printf("析构\n");
}
};
int main()
{
to eqq("小草",12);
to eqq2(eqq);
}
int c=EQQ.C;
NAME=EQQ.NAME;
name不为空 free无法二次释放
深拷贝
include
using namespace std;
class to
{
public:
int c=0;
char* pname;
char* zz;
to(const char* a,int age)
{
c = age;
pname = (char*)malloc(strlen(a) + 1);
strcpy(pname, a);
printf("构造:%d %s\n",c, pname);
}
~to()
{
if (pname != NULL)
{
free(pname);
pname = NULL;
}
printf("析构\n");
}
to(const class to& a)
{
pname = (char*)malloc(strlen(a.pname) + 1);
strcpy(pname, a.pname);
c = a.c;
}
};
int main()
{
to eqq("小草",12);//
/*
int c=EQQ.C;
NAME=EQQ.NAME;
*/
to eqq2(eqq);
printf("%s哈哈\n", eqq2.pname);
}
explicit
只能放在构造函数前,构造函数只有一个参数或者其他参数有默认值时
include
using namespace std;
class to
{
public:
explicit to(int n)
{
}
};
int main()
{
to z = 10;//to z(10) 编译器默认优化
}
静态成员
1.静态成员变量的生命周期是整个程序,作用域在类内
2.静态成员变量在类内声明,类外初始化
3.属于类,所有对象共享
4.类 访问 对象访问都可以
class to
{
public:
static int mm;
to(int n)
{
}
};
int to::mm = 100;
int main()
{
printf("%d", to::mm);
}
静态函数只能 访问静态变量
也是每个成员共有的可以类访问
include
using namespace std;
class to
{
public:
static int mm;
int age = 12;
to(int n)
{
}
static void test()
{
printf("%d", mm);//erro
}
};
int to::mm = 100;
int main()
{
to::test();
}
本文来自博客园,作者:逆向狗,转载请注明原文链接:https://www.cnblogs.com/Agtw/p/17240587.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!