归来

来源:互联网 发布:王毅加拿大知乎 编辑:程序博客网 时间:2024/04/28 04:48

回家的一周,眨眼间就过完了,又回到了此地。


事情又一堆一堆的,之前从未意识到一周的时间能够那么有用,完全去掉这一周之后才发觉,原来以前一个星期虽然感觉没做什么,但是一旦什么也没做,就会丢下太多,

正如同努力不一定有收获,不努力就一定没有收获一样,人生路还长,要学的东西还很多,把握今天,珍惜现在,利用好每天的每分每妙,可以不是每天都产生质的飞跃,但是

一定要有量的积累,积小流以成江河,积跬步以致千里。


既是技术博客,感慨就仅叙如此,还是写点有关编程技术方面的内容吧。


总结下自己之前曾经短暂的实习过程中所学的知识吧。上次回家前的那篇其实就是最先学习的内容,接下来以序号分别分享相关内容。

2. 拷贝构造函数,是以对象构造对象的方法,形参必须为引用类型(否则会导致栈溢出),一般为了防止对原类型产生错误修改(因为是引用)加上const限制,在C++中,一般有以下三种情况需要用到拷贝构造函数:a. 一个对象作为函数参数,以值传递的方式传入函数体;b. 一个对象作为函数返回值,以值传递的方式从函数返回; c. 一个对象用于给另外一个对象初始化(常称赋值初始化)。以下赋上一个有关拷贝构造函数的实例。其中对内存分配失败并未采用异常,而是直接使用循环分配至成功的方式处理。如有妙法,请评论。

#include <string.h>#include <iostream>using namespace std;class point_t{public:point_t()         //无参构造函数{m_x = 0;m_y = 0;m_len = 0;m_str = NULL;}point_t(int x_, int y_, const char* s_)      //含参构造函数{m_x = x_;m_y = y_;m_len = strlen(s_);m_str = new char[m_len];while(NULL == m_str)                  //内存分配失败,则一直分配至成功m_str = new char[m_len];memcpy(m_str, s_, (m_len+1) * sizeof(char));}~point_t(){        if(NULL != m_str)        {        delete m_str;        m_str = NULL;        }}point_t& operator = (const point_t& point_)           //重载赋值运算符{m_x = point_.m_x;m_y = point_.m_y;m_len = point_.m_len;m_str = new char[m_len];while(NULL == m_str)m_str = new char[m_len];memcpy(m_str, point_.m_str, (m_len+1) * sizeof(char));return *this;}void set_x(int x_) {m_x = x_;}void set_y(int y_){m_y = y_;}void set_str(const char* s_){m_len = strlen(s_);m_str = new char[m_len];while (NULL == m_str)m_str = new char[m_len];memcpy(m_str, s_, (m_len+1) * sizeof(char));}int get_x() const{return m_x;}int get_y() const{return m_y;}char* get_string() const{return m_str;}private:int m_x;int m_y;int m_len;char* m_str;};class construct_t{public:construct_t(){m_data = 0;m_size = 0;m_point.set_x(0);m_point.set_y(0);m_content = NULL;}construct_t(int m_, const char* s_, int x_, int y_, const char* str_){m_data = m_;m_size = strlen(s_);m_content = new char[m_size];//内存申请不成功,等待内存的释放,再申请,实现异常安全while (NULL == m_content)    m_content = new char[m_size];memcpy(m_content, s_, (m_size+1) * sizeof(char));m_point.set_x(x_);m_point.set_y(y_);m_point.set_str(str_);}~construct_t(){        //m_content不为空,释放它占用的内存        if(NULL != m_content)    {                delete m_content;                m_content = NULL;            }}//拷贝构造函数的实现construct_t(construct_t& con_){m_data = con_.m_data;m_size = con_.m_size;m_content = new char[m_size];//用抛出异常的方式实现异常安全/* try{m_content = new char[m_size];//内存申请不成功,抛出异常if (NULL == m_content){throw m_content;}//成功申请内存memcpy(m_content, con.m_content, m_size*sizeof(char));        }        //捕捉异常catch(char *){                   cout << "error!!!" << endl;        }*///内存申请不成功,等待内存的释放,再申请,实现异常安全while (NULL == m_content){m_content = new char[m_size];}memcpy(m_content, con_.m_content, (m_size+1) * sizeof(char));m_point = con_.m_point;}int get_data() const{return m_data;}char* get_str() const{return m_content;}point_t get_point() const{return m_point;}void show_data() const{cout << "data: " << m_data << endl;}void show_str() const{cout << "string: " << m_content << endl;}void show_point() const{cout << "Point: " << endl;cout << "X: " << m_point.get_x() << endl;cout << "Y: " << m_point.get_y() << endl;cout << "Str: " << m_point.get_string() <<endl;}private:int m_data;int m_size;char* m_content;point_t m_point;};int main() {//construct_t con1();char s[] = "abcdefghij";char str[] = "wdmyong";construct_t con2(5, s, 12, 24, str);construct_t con3(con2);cout << "con2: " << endl;con2.show_data();con2.show_str();con2.show_point();cout << endl << "con3: " << endl;con3.show_data();con3.show_str();con3.show_point();system("pause");return 0;}

0 0
原创粉丝点击