c++基础-关于C++重载函数的问题将实现两个字符串连起来

问题描述

关于C++重载函数的问题将实现两个字符串连起来
#include
using namespace std;
class UString
{
protected:
char *str;
int len;
public:
UString()
{
str=0;
len=0;
}
UString(char *c)
{
len=strlen(c);
str=new char(len+1);
strcpy(strc);
}
UString(UString &a)
{
if(!str) delete str;
str=new char[strlen(a.str)+1];
strcpy(stra.str);
}
~UString()
{
delete str;
}
UString operator+(const UString &a)
{
UString temp;
temp.str=new char[strlen(str)+strlen(a.str)+1];
strcpy(temp.strstr);
strcat(temp.stra.str);
return temp;
}
void show()
{
cout<<str<<endl;
}
};
int main()
{
UString str1(""abc"")str2(""def"")c;
c=str1+str2;
c.show();
return 0;
}

求大神解答下!!

解决方案

请问你的程序是否一运行就崩溃了。
首先,拷贝构造函数UString(UString &a)中的逻辑 为空则释放指针指向的空间本身就是错误的,释放空指针本身就会引起段错误
然后,请用delete[] str,替换为 delete str。str指向的是动态数组,使用普通的释放方式应该会有语法错误
其次,代码不严谨,~UString()中,假如str为空,对它进行进行空间释放肯定会出错。
最后,最隐蔽也是致命的bug,请考虑使用深拷贝。c=str1+str2一行会调用operator+ 和 operator=,operator+中有个自动变量temp,函数调用结束会清理temp,释放temp中的指针,return过程会发生UString对象的拷贝构造,构造一个UString临时对象(方便后面陈述称其为A),由于未定义拷贝构造函数那么会调用默认的,默认的实现会仅仅拷贝成员指针的值,那么A中的指针指向的空间早已因为temp的析构被释放,当c=str1+str2执行完必然也要释放A,此时重复释放A中指针就会产生错误。请重写复制构造函数和operator=。

时间: 2024-09-19 20:56:04

c++基础-关于C++重载函数的问题将实现两个字符串连起来的相关文章

C++运算符重载函数基础及其值返回状态

运算符重载是C++的重要组成部分,它可以让程序更加的简单易懂,简单的运算符使用可以使复杂函数的理解更直观. 对于普通对象来说我们很自然的会频繁使用算数运算符让他们参与计算,但是对于自定义类的对象来说,我们是无论如何也不能阻止写出像下面的代码一样的程序来的. 例子如下: class Test{ //过程省略}int main(){ Test a,c; c=a+a;} 当然这样的代码是不能够通过编译的,c++对自定类的算术运算部分保留给了程序员,这也是符合c++灵活特性的. 在c++中要想实现这样的

【javascript基础】2、函数

原文:[javascript基础]2.函数 前言 我在上一篇[javascript基础]基本概念中介绍了javascript的一些基本概念,多谢大家的阅读和意见,自己写的东西可以被大家阅读,真心高兴,刚开始发布的时候我一直盯着阅读人数,虽然知道大家可能就是点开一下而已,但是还是给我一些继续写下去的信心.那今天写一些关于javascript函数的一些知识,帮助大家熟悉或者复习一些函数的基本知识. PS:最近jQuery源码交流群( 239147101)加了不少热新人,希望大家还是以学习为主,尽量少

如何在派生类中的隐藏基类的虚拟重载函数

我创建了一个类,基类中有虚拟重载函数.我想在派生类中改写基类中的虚拟重载函数.代码如下: #include <iostream.h>class B {private: int nNumber;public: virtual void test() { cout << "B::test()\n"; } virtual void test(int x) { nNumber = x; // 将传入的参数赋值给私有成员 cout << "B::te

C++中利用构造函数与无名对象简化运算符重载函数

在完整描述思想之前,我们先看一下如下的例子,这个例子中的加运算符重载是以非成员函数的方式出现的: //程序作者:管宁//站点:www.cndev-lab.com//所有稿件均有版权,如要转载,请务必著名出处和作者 #include <iostream>using namespace std; class Test{ public: Test(int a) { Test::a = a; } friend Test operator + (Test&,int); public: int a

对象-求解下列代码,我现在就是基础,知道每个函数,方法的意思,但是不知道它们是为了什么创建,用来干什么

问题描述 求解下列代码,我现在就是基础,知道每个函数,方法的意思,但是不知道它们是为了什么创建,用来干什么 求解下列代码,我现在就是基础,知道每个函数,方法的意思,但是不知道它们是为了什么创建,用来干什么,求大神帮忙 public String getByTrainingOrCompetitionID() throws Exception { zheJiuSheZhiList = dao.getList(shengChanXianID); if(zheJiuSheZhiList.size()>0

gmock怎样mock重载函数

问题描述 gmock怎样mock重载函数 Gmock不会用,不知道怎样给重载函数写mock,方法声明可以过,调用写expect call总不是期望的值

vbscript怎么调用com组件里的重载函数?

问题描述 用c#作了个com组件,里面有重载函数.如:com.func(intvalu)com.func(intvalue,stringname)vbs代码:setobj=createobject("com")dimtestsubmain()test=func(1)test=func(1,"abc")//这里会报错endsub在vbscript里只能调用排在前面定义的,排在后面的不能识别.怎么能解决阿? 解决方案 解决方案二:obj.func1,"abc&

string-java中如果重载函数前不加@Override会怎么样?

问题描述 java中如果重载函数前不加@Override会怎么样? 比如重载toString函数,若前面不加那个@Override后果是什么?就不重载了? @Override public String toString() { return description; } 解决方案 1.帮助自己检查是否正确的复写了父类中已有的方法 2.告诉读代码的人,这是一个复写的方法 关于第一点,我给你再说明一下: 假设你现在要覆盖一个方法,然后因为你粗心,写错了参数的类型,刚好你又没有写@override注

《C++ Templates中文版》——2.4 重载函数模板

2.4 重载函数模板 和普通函数一样,函数模板也可以被重载.就是说,相同的函数名称可以具有不同的函数定义:于是,当使用函数名称进行函数调用的时候,C++编译器必须决定究竟要调用哪个候选函数.即使在不考虑模板的情况下,做出该决定的规则也已经是相当复杂,但在这一节里,我们将讨论有关模板的重载问题.如果你对不含模板的重载的基本规则还不是很熟悉,那么请先阅读附录B,在那里我们对重载解析规则进行了很详细的叙述. 下面的简短程序叙述了如何重载一个函数模板: //basics/max2.cpp //求两个in