关于cin输入问题

姜培 发布于 2018/04/04 14:02
阅读 112
收藏 0

各位大神好,近期小白在学习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,函数。。

各位大神求指教,本小白头一次发,谢谢了!!!

 

加载中
0
qlee
qlee
String haha;

在这里就会调用默认构造函数吧。

qlee
qlee
回复 @姜培 : 本机跑了下没问题
姜培
对的,这里就会自动调用默认构造函数,但是,,为什么不接受cin输入,,
返回顶部
顶部