回家的一周,眨眼间就过完了,又回到了此地。
事情又一堆一堆的,之前从未意识到一周的时间能够那么有用,完全去掉这一周之后才发觉,原来以前一个星期虽然感觉没做什么,但是一旦什么也没做,就会丢下太多,
正如同努力不一定有收获,不努力就一定没有收获一样,人生路还长,要学的东西还很多,把握今天,珍惜现在,利用好每天的每分每妙,可以不是每天都产生质的飞跃,但是
一定要有量的积累,积小流以成江河,积跬步以致千里。
既是技术博客,感慨就仅叙如此,还是写点有关编程技术方面的内容吧。
总结下自己之前曾经短暂的实习过程中所学的知识吧。上次回家前的那篇其实就是最先学习的内容,接下来以序号分别分享相关内容。
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;
}