深圳网站建设外贸公司价格,我做的网页怎么是危险网站,做网上商城网站哪家好,做外贸登录国外网站欢迎来观看温柔了岁月.c的博客 目前 设有C学习专栏 C语言项目专栏 数据结构与算法专栏 目前主要更新C学习专栏#xff0c;C语言项目专栏不定时更新 待C专栏完毕#xff0c;会陆续更新C项目专栏和数据结构与算法专栏 一周主要三更#xff0c;星期三#xff0c;星期五#x… 欢迎来观看温柔了岁月.c的博客 目前 设有C学习专栏 C语言项目专栏 数据结构与算法专栏 目前主要更新C学习专栏C语言项目专栏不定时更新 待C专栏完毕会陆续更新C项目专栏和数据结构与算法专栏 一周主要三更星期三星期五星期天 感谢大家的支持 C构造和析构构造函数特点构造函数的创建和使用有参构造函数无参构造函数关于new的构造函数析构函数特点拷贝构造函数特点深拷贝和浅拷贝匿名对象析构与构造调用的顺序构造函数
特点 1.名字和类名相同 2.没有返回值 3.构造函数是用来构造对象构造对象时候必定调用构造函数 4.不写构造函数存在一个默认的构造函数默认的构造函数是无参的所以可以构造无参对象 5.默认的构造函数可以删掉通过delete可以删除默认的构造函数 6.显示使用默认的构造函数用defalt做显示调用 7.通常构造函数是public 8.如果自己写了构造函数系统的默认构造函数就会不存在 9.构造函数决定对象的长相构造函数有几个参数构造的对象就要有几个参数 10.构造函数通常做的事情就是给数据成员初始化。 11.构造函数也是函数可以进行重载也可以进行缺省。 12.通过缺省和重载可以创建各种彰显不同的对象 #includeiostream
#includestringusing namespace std;class MM
{
public:MM() default; //显示使用默认构造函数MM() delete; //删除默认的构造函数private:int age;string name;
};
int main()
{system(pause);return 0;
}注意:如果一个类中的默认构造函数被删除的话是不能够构造对象的。
构造函数的创建和使用
有参构造函数
#includeiostream
#includestringusing namespace std;class MM
{
public:MM(int m_age, string m_name){age m_age;name m_name;}void printDate(){cout age \t name endl;}private:int age;string name;
};int main()
{MM mm(10, 温柔了岁月); //构造函数有2个参数所以这路必须也要有两个参数创建对象的过程就是调用构造函数过程mm.printDate();system(pause);return 0;
}无参构造函数
#includeiostream
#includestringusing namespace std;class MM
{
public:MM(); //无参构造函数
private:int age;string name;
};
int main()
{MM mm;system(pause);return 0;
关于new的构造函数
#includeiostream
#includestringusing namespace std;class MM
{
public:MM(); //无参构造函数MM(int m_age, string m_name){age m_age;name m_name;}private:int age;string name;
};
int main()
{MM *p1 new MM; //无参构造函数MM* p2 new MM(18, 温柔了岁月); //有参的构造函数system(pause);return 0;
}析构函数
特点 1.~类名当作析构函数的名称 2.没有参数 3.释放数据成员new的内存 在对象死亡前自动调用 4.如果数据成员没有做new的操作可以不写析构函数不写析构函数系统存在一个默认的析构函数 //析构函数
#includeiostream
#includecstringusing namespace std;class MM
{
public:MM(const char * str){int length strlen(str) 1;name new char[length];strcpy(name, str);}~MM(){if (name ! nullptr){delete name;name nullptr;}cout 析构函数 endl;}private:char* name;
};
int main()
{MM* pmm new MM(温柔了岁月);delete pmm;pmm nullptr; //立刻调用析构函数system(pause);return 0;
}拷贝构造函数
特点 1.拷贝构造函数也是构造函数 2.拷贝构造函数的参数是固定的对对象的引用 3.拷贝构造函数不写会存在一个默认的拷贝构造函数 4.拷贝构造函数的作用通过一个对象创造另一个对象。 #includeiostream
#includestringusing namespace std;class MM
{
public:MM(int m_age){age m_age;}//拷贝构造函数通过传入对象属性确定创建对象属性MM(MM object){age object.age;}void printDate(){cout age endl;}private:int age;
};
//函数传参也可以隐式调用
void print(MM object)
{object.printDate();
}void Print(MM object) //引用只是取别名不调用拷贝构造函数效率较高
{object.printDate();
}int main()
{MM mm(10);//产生对象MM pmm mm; //隐式构造MM pm(mm); //显式构造print(mm); //隐式调用拷贝构造函数system(pause);return 0;
}深拷贝和浅拷贝 浅拷贝: 没有在拷贝构造函数中使用new 默认的拷贝构造函数都是浅拷贝 深拷贝 在拷贝构造函数中做了new的操作 内存释放问题 浅拷贝会导致同一段内存重复释放 //浅拷贝问题
#includeiostream
#includecstringusing namespace std;class MM
{
public:MM(const char* m_name){name new char[strlen(m_name) 1];strcpy(name, m_name);}MM(MM object){name object.name;}~MM(){if (name ! nullptr){delete name;name nullptr;}}private:char* name;
};
int main()
{MM mm(温柔了岁月);MM pmm mm;return 0;
}delete把相同的两端数据都删除了所以程序中断浅拷贝的问题要用深拷贝来解决。 解决方法
#includeiostream
#includecstringusing namespace std;class MM
{
public:MM(const char* m_name){name new char[strlen(m_name) 1];strcpy(name, m_name);}MM(MM object){int length strlen(object.name) 1;name new char[length];strcpy(name, object.name);}~MM(){if (name ! nullptr){delete name;name nullptr;}}private:char* name;
};
int main()
{MM mm(温柔了岁月);MM pmm mm;return 0;
}一旦类中有指针做了内存申请并且对对象做了拷贝操作就必须使用深拷贝 匿名对象 1.匿名对象就是无名对象匿名对象只能充当右值 2.如果做特殊处理会直接死掉要想对匿名对象赋初值必须存在移动构造拷贝或者有const存在的普通拷贝构造。 #includeiostreamusing namespace std;class MM
{
public:MM(int m_age){age m_age;}void printDate(){cout age endl;}MM(MM object){age object.age;cout 调用移动构造 age endl;}~MM(){cout 析构函数 endl;}
private:int age;
};int main()
{MM(10); //匿名对象没有名字MM girl MM(10); //赋值对象, girl接管匿名对象的所有权girl.printDate();system(pasuse);return 0;
}析构与构造调用的顺序 1 . 一般情况构造顺序和析构顺序是相反的 2.全局和静态变量最后释放的 3.delete会立刻调用析构函数