隐式成员函数

隐式成员函数.
1 .默认构造函数
声明 ClassName();
ClassName::ClassName(){}

2.复制构造函数
//*在参数传值时或返回对象时一定被调用
声明 ClassName(const ClassName &);
1>新建对象并将其初始化为同类对象时调用
ClassName cla(cal2);                 //直接创建
ClassName cla=cla2;                  //有可能生成临时对象
ClassName cla=ClassName(cla2);       //有可能生成临时对象
ClassName * psd=new ClassName(cla);  //由delete释放
2>复制构造函数功能
逐个复制非静态成员
ep:
cla.str=cla2.str;
cla.len=cla2.len;

3.赋值操作符
声明 ClassName & operator = (const ClassName &);3


类中包含"new" "初始化"的指针成员
需要深度复制  strcpy 
而不是cla.str=cla.str2;(复制的是一个地址)

////////////////////////////////////////////////////
///////////////main.cpp/////////////////////////////
#include <iostream>
#include "strngbad.h"

using std::cout;

void callme1 (String &);
void callme2 (String);

int main()
{
 using std::endl;
 String headline1("celery stalks at midnight");
 String headline2("lettuce prey");
 String sports("sadsadasd asd  sad");
 cout<<"headline1"<<headline1<<endl;
    cout<<"headline2"<<headline1<<endl;
 cout<<"sports"<<sports<<endl;
 callme1(headline1);
    cout<<"headline1"<<headline1<<endl;
 callme2(headline2);
    cout<<"headline2"<<headline1<<endl;
    cout<<"initialize one obj to another:\n";
 String knot;
 knot=headline1;
 cout<<"knot:"<<knot<<endl;
 cout<<"end of main()\n";

 return 0;
}

void callme1(String & rsb)
{
 cout<<"str reference:\n";
 cout<<"  \""<<rsb<<"\"\n";
}

void callme2(String sb)
{
 cout<<"str value:\n";
 cout<<"  \""<<sb<<"\"\n";
}


/////////////////////////////////////////////////////////////
////////////////strngbad.h///////////////////////////////////
#include <iostream>
#ifndef STRNGBAD_H_
#define STRNGBAD_H_

class String
{
private:
 char * str;
 int len;
 static int num_strings;
public:
 String(const char * s);
 String(const String &);
 String();
 ~String();
 String & operator = (const String &);
 friend std::ostream & operator << (std::ostream & os,const String & st);
};

#endif


//////////////////////////////////////////////////////////
///////////////////////strngbad.cpp///////////////////////
#include <cstring>
#include "strngbad.h"
using std::cout;

int String::num_strings=0;

String::String(const char * s)
{
 len=strlen(s);
 str=new char[len+1];
 strcpy(str,s);
 num_strings++;
    cout<<num_strings<<": \""<<str<<"\"object created\n";
}

String::String(const String & st)
{
 num_strings++;
 len=st.len;
 str=new char [len+1];
 strcpy(str,st.str);
 cout<<num_strings<<":\""<<str<<"\" obj created\n";
}

String::String()
{
 len=4;
 str=new char[4];
 strcpy(str,"c++");
 num_strings++;
 cout<<num_strings<<": \""<<str<<"\"object created\n";
}

String::~String()
{
 cout<<"\""<<str<<"\" object deleted,";
 --num_strings;
 cout<<num_strings<<" left\n";
 delete [] str;
}

String & String::operator = (const String & st)
{
 if (this==&st)
  return *this;
 delete [] str;
 len=st.len;
 str=new char [len+1];
 strcpy(str,st.str);
 return *this;
}

std::ostream & operator << (std::ostream & os,const String & st)
{
 os<<st.str;
 return os;
}

posted @ 2007-02-20 06:00  Edward Xie  阅读(192)  评论(0)    收藏  举报