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

pc网站手机网站网站后台是做什么的

pc网站手机网站,网站后台是做什么的,哪些网站做装修,swf格式网站链接怎样做含有对象成员的构造函数深复制与浅复制拷贝&#xff08;复制&#xff09;构造函数 第一部分&#xff1a;含有对象成员的构造函数 以下是一个学生 类包含日期成员出生日期的代码 #include<iostream> using namespace std; class Date { public:Date(int year,int month…
  • 含有对象成员的构造函数
  • 深复制与浅复制
  • 拷贝(复制)构造函数

第一部分:含有对象成员的构造函数

以下是一个学生 类包含日期成员出生日期的代码

#include<iostream>
using namespace std;
class Date
{
public:Date(int year,int month,int day):year(year),month(month),day(day){cout << "Date 构造函数被调用" << endl;}
void printDate()
{cout << year << "年" << month << "月" << day << "日";
}private:
int year,month,day;};class Student
{
public:Student(string name,Date birthday) : name(name),birthday(birthday){cout << "student 的构造函数被调用" << endl;}Student(string name,int year,int month,int day):name(name),birthday(year,month,day){cout << "Student 的构造函数被调用222" << endl;}void printStudentInfo(){cout << "姓名" << name << ",出生日期" << endl;birthday.printDate();cout << endl;}
private:string name;Date birthday;
};int main()
{Student stu1("小明",{2002,5,4}),stu2("小红",2003,3,6);stu1.printStudentInfo();stu2.printStudentInfo();return 0;
}

Date 构造函数被调用
student 的构造函数被调用
Date 构造函数被调用
Student 的构造函数被调用222
姓名小明,出生日期
2002年5月4日
姓名小红,出生日期
2003年3月6日

小结:含有对象成员的类创建对象时,对象成员的初始化要在初始化列表中,运行时会先调用对象成员的构造函数,再调用当前类自己的构造函数。

第2部分:深复制与浅复制

#include<iostream>
using namespace std;class Mystring
{
public:
Mystring(const char* str)
{length = strlen(str);data = new char[length + 1];strcpy(data,str);
}
~Mystring()
{delete[] data;
}
void printString()
{cout << data << endl;
}private:
char* data;
int length;
};int main()
{Mystring s("Hello world!");s.printString();Mystring s2 = s;s2.printString();return 0;
}

浅复制:浅复制是默认的构造函数

Mystring s2 = s;

没有写拷贝构造函数时,系统会自动生成一个“默认拷贝构造函数”,它会对每个成员变量做“逐成员复制”。

对于普通变量(如 int length)是没问题的,但对于指针(char* data),浅复制只是把地址复制过去,不会新建一份数据内容

 结果就是 s.data 和 s2.data 都指向同一块内存!

这就会导致:

  • 两个对象共享同一块堆内存

  • 当 s 和 s2 析构时,都执行 delete[] data,会对同一内存释放两次,造成程序崩溃或未定义行为(⚠️ 危险)

那么深复制的时候:就是复制内容,而不是复制指针地址,所以你只需要手动实现拷贝构造函数

Mystring(const Mystring& other)
{
    length = other.length;
    data = new char[length + 1];       // 分配新内存
    strcpy(data, other.data);          // 复制内容
}

 

所以这个就是以下的区别:

 

第三部分:拷贝(复制)构造函数

#include<iostream>
using namespace std;class Mystring
{
public:
Mystring(const char* str)
{length = strlen(str);data = new char[length+1];strcpy(data,str);cout << "Mystring的构造函数被调用" << endl;
}
Mystring(const Mystring& str)
{length = str.length;data = new char[length+1];strcpy(data,str.data);cout << "Mystring 的拷贝构造函数被调用" << endl;
}
~Mystring()
{delete[] data;
}
void printString()
{cout << data << endl;
}
private:
char* data;
int length;
};int main()
{Mystring s("Hello world");s.printString();Mystring s2(s);s2.printString();return 0;
}
  • 必须使用引用参数(避免无限递归调用)
  • 通常为 const 引用(保证源对象不被修改)
  • 编译器默认生成(仅当类无用户自定义构造函数时)

那这里面的拷贝构造函数是什么?

Mystring(const Mystring& str)
{length = str.length;data = new char[length + 1];      // 分配新空间strcpy(data, str.data);           // 拷贝字符串内容cout << "Mystring 的拷贝构造函数被调用" << endl;
}

 

用一个已经存在的对象去创建一个新的对象,并且为其分配新的内存( 深拷贝),防止多个对象共享同一块内存。

 Mystring s2(s);

调用拷贝构造函数 Mystring(const Mystring& str) 创建新对象 s2

#include<iostream>
#include<string>
using namespace std;class CPU{
public:CPU(const string& cpu) : model(cpu){cout << "cpu constructed" << endl;}void printInfo() const{cout << "CPU型号" << model << endl;}
private:string model;
};class Monitor{
public:Monitor(const string& monitor) : brand(monitor){cout << "Monitor constructed" << endl;}void printInfo() const{cout << "Monitor品牌" << brand << endl;}
private:string brand;
};class Computer{
public:Computer(int memory,const string& cpuModel,const string& monitorBrand): memory(memory),cpu(cpuModel),monitor(monitorBrand){cout << "Computer构造函数被调用" << endl;}void printInfo() const{cout << "内存容量 " << memory << " GB" << endl;cpu.printInfo();monitor.printInfo();}
private:int memory;CPU cpu;Monitor monitor;
};int main()
{Computer c(16,"Intel 890000","mac");c.printInfo();return 0;
}

 

  1. 定义一个Person类,包含char*类型的name,int age和Adress类型的address。Address是表示地址的类,包含char* street和int类型的houseNumber。请合理实现这两个类,使其能正常的完成如下的使用:
  2. #include <iostream>
    #include <cstring>
    using namespace std;class Address {
    public:Address(const char* streetName, int houseNum) {street = new char[strlen(streetName) + 1];strcpy(street, streetName);houseNumber = houseNum;cout << "Address构造函数被调用" << endl;}Address(const Address& other) {street = new char[strlen(other.street) + 1];strcpy(street, other.street);houseNumber = other.houseNumber;}~Address() {delete[] street;}void printAddress() const {cout << "地址: " << street << ", 门牌号: " << houseNumber << endl;}private:char* street;int houseNumber;
    };class Person {
    public:Person(const char* n, int a, const Address& addr) : age(a), address(addr) {name = new char[strlen(n) + 1];strcpy(name, n);cout << "Person构造函数被调用" << endl;}Person(const Person& other) : age(other.age), address(other.address) {name = new char[strlen(other.name) + 1];strcpy(name, other.name);}~Person() {delete[] name;}void printInfo() const {cout << "姓名: " << name << ", 年龄: " << age << endl;address.printAddress();}private:char* name;int age;Address address;
    };int main() {Address addr("人民路", 100);Person p("张三", 20, addr);p.printInfo();return 0;
    }

http://www.dtcms.com/wzjs/791655.html

相关文章:

  • 简述织梦网站上传及安梅州正在建设高铁线路
  • 怎么用PS做珠宝网站秦皇岛网站开发
  • 福田网站建设标准数据软件工程学费
  • 一个简易网站怎么做室内装修设计说明
  • 查询域名的网站培训心得
  • 网站建设人力调配范文竞价单页网站策划设计制作
  • 承德建设网站公司济南网站建设(选聚搜网络)
  • 各购物网站销售特点百度指数分析报告
  • 网站集约化建设难点浏览器打不开wordpress
  • 网站后台下载器网站开发设计师
  • 网站的flash怎么做的网站开发为什么需要团队完成
  • 忘记网站后台用户名短视频营销常用平台有
  • 鹤壁市做网站销售客户管理软件哪个好
  • 网站建设方案案例厦门市建设局网站咨询电话
  • 临沂哪里做网站比较好深圳互联网设计开发
  • 建设专业网站运营团队百度快照优化培训班
  • 云服务器可以做网站生道网站建设平台
  • 建筑知识网站公司网站建设管理制度
  • 贵州住建设局官方网站中国建设网官网住房和城乡建设官网
  • 做乡镇网站岳阳有哪几家做网站的
  • 有些网站做不了seo深圳做地铁的公司网站
  • 自动写作文网站怎么样制作一个公众号
  • 临沂做网站公司软件外包公司好不好
  • 动漫网站开发与建设wordpress文章发布时间
  • 网站外链应该怎么做公司背景墙logo设计
  • 对于网站建设提出建议广州建网站哪家好
  • 广州中小学安全教育平台网站排名优化服务公司
  • pc端网站开发总结wordpress文章首行
  • 网站开发ppt模板大学电子系的建设网站的方案
  • 网站建设开发流程深圳网页设计培训教程