各位大神好,近期小白在学习C++时,碰到了一个问题,,闲着没事调试了一下代码,,没想到在里面随意加了一个cin输入,竟然没想到,默认构造函数直接就给它赋值了,没有理会cin》haha,这条语句,直接就执行后面的,现在贴出这个类的全部代码,求高手指点
.h文件如下:
//注意,这个1是新的修改的类
#ifndef STRING1_H
#define STRING1_H
#include<iostream>
using std::ostream;
using std::istream;
class String
{
private :
char *str;
int len;
static int num_strings;
static const int CINLIM = 80;
public:
String(const char *s);//构造函数
String(const String & );
//String (const String &); //复制构造函数
String();//默认构造函数
~String();
int length()const
{
return len;
}
//重载operator 方法
String & operator=(const String &);
String & operator =(const char *);
char & operator[](int i);
const char & operator[](int i)const;
//重载 友元
friend bool operator <(const String &st1, const String & st2);
friend bool operator >(const String &st1, const String & st2);
friend bool operator ==(const String &st1, const String & st2);
friend ostream & operator <<(ostream & os,const String &st );
friend istream & operator >>(istream & is, String &st);
static int Howmany();
};
#endif
接下来是两个cpp文件:
#include<iostream>
#include<cstring>
#include"string.h"
#pragma warning(disable:4996)//这句话是
using std::cout;
using std::cin;
using std::endl;
int String::num_strings = 0;
int String::Howmany() {
return num_strings; //静态类成员函数
}
String::String(const char *s)
{
len = std::strlen(s);
str = new char[len + 1];
std::strcpy(str, s); //
num_strings++;
}
String::String()
{
len = 4;
str = new char[1];
str[0] = '\0';
num_strings++;
}
String::String(const String &st)
{
num_strings++;
len = st.len;
str = new char[len + 1];
std::strcpy(str, st.str);
}
String::~String() {
cout << "\"" << str << "\" objects 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];
std::strcpy(str, st.str);
return *this;
}
String &String::operator=(const char *s) //重载
{
delete[]str;
len = std::strlen(s);
str = new char[len + 1];
std::strcpy(str, s);
return *this;
}
char &String:: operator[](int i) {
return str[i];
}
const char &String:: operator[](int i) const
{
return str[i];
}
bool operator <(const String &st1, const String & st2) //重载比较函数友元函数
{
return (std::strcmp(st1.str, st2.str) < 0);
}
bool operator >(const String &st1, const String & st2)
{
return (std::strcmp(st1.str, st2.str) > 0);
}
bool operator ==(const String &st1, const String & st2)
{
return (std::strcmp(st1.str, st2.str) == 0);
}
ostream & operator <<(ostream & os, const String &st) {
os << st.str;
return os;
}
istream & operator >> (istream & is, String &st) {
char temp[String::CINLIM];
is.get(temp, String::CINLIM); //输入字符串;
if (is)
st = temp;
while (is && is.get() != '\n')
continue;
return is;
}
下面的这个是包含主函数的cpp 文件:
// 注意这个程序是利用指向对象的指针,要注意和以前那个函数cpp的区别。
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<cstring>
#include"string.h"
#pragma warning(disable:4996)//这句话是
const int Arsize = 11;
const int Maxlen = 81;
using namespace std;
int main() {
String name;
cout << "Hi,what is your name?\n";
cin >> name;
cout << name << ",please enter up to " << Arsize << " short sayings \n";
String sayings[Arsize];
char temp[Maxlen];
int i;
for (i = 0; i < Arsize; i++)
{
cout << i + 1 << ":";
cin.get(temp, Maxlen);
while (cin && cin.get() != '\n')
continue;
if (!cin || temp[0] == '\0')
break;
else
sayings[i] = temp;
}
cout << "please input haha\n";
String haha;
cin >> haha;
cout << haha << Arsize << endl;
return 0;
} 本小白疑问的就是这个地方,,为什么haha这个对象直接被默认构造函数赋值了,没有执行下面的cin>>haha,函数。。
各位大神求指教,本小白头一次发,谢谢了!!!
在这里就会调用默认构造函数吧。