我用"cin"来读取输入流中的单词,就像
int main( ){
string word;
while (cin >> word){
//do sth on the input word
}
// perform some other operations
}
Run Code Online (Sandbox Code Playgroud)
代码结构类似于上面的代码结构.它是可编译的.在执行期间,我继续输入类似的内容
aa bb cc dd
Run Code Online (Sandbox Code Playgroud)
我的问题是如何结束这个输入?换句话说,假设文本文件只是"aa bb cc dd".但我不知道如何让程序知道文件结束.
在"The C++ Programming Language"一书中,作者给出了以下示例以及几个语句:
如果仅仅返回引用并让用户决定如何处理它是不可接受的,那么定义用于读取和写入的操作符(例如[])是很困难的.
Cref,是帮助实现区分阅读和写作的下标操作符.
为什么[]难以定义何时用于读写?类Cref的定义如何帮助解决这个问题?
class String{
struct Srep;
Srep *rep;
public:
class Cref;
// some definitions here
void check (int i) const { if (i<0 || rep->sz<=i) throw Range( );}
char read( int i) const {return rep->s[i];}
void write(int i, char c){ rep=rep->get_own_copy(); rep->s[i]=c;}
Cref operator[] (int i){ check(i); return Cref(*this, i);}
char operator[] (int i) const{check(i); return rep->s{i];}
}
class String::Cref{
friend class String;
String& s;
int i;
Cref(String& ss, int ii): s(ss),i(ii) {}
public:
operator …Run Code Online (Sandbox Code Playgroud) 结构化数据和非结构化数据之间有什么区别?这种差异如何影响各自的数据挖掘方法?
我下载了一个demo jar文件,想在eclipse中打开它.我做的是
import->现有项目进入工作空间 - >选择存档文件
然而,eclipse返回"没有找到要导入的项目".
作为命令行,我输入
java -jar projectDemo.jar
这个jar文件运行良好.所以在我看来jar文件本身没问题,但是如何在Eclipse中打开它并修改这个演示代码?谢谢.
在"The C++ programming language"中,在265页,作者发表以下声明:
由于历史事故,运算符=(赋值),&(地址)和(序列;§6.2.2)在应用于类对象时具有预定义的含义.一般用户可以通过将其设为私有来使这些预定义含义无法访问:
然后给出以下示例:
class X {
private:
void operator=(const X&);
void operator&();
void operator,(const X&);
// ...
};
void f(X a, X b)
{
a = b; // error: operator= private
&a; // error: operator& private
a,b; // error: operator, private
}
Run Code Online (Sandbox Code Playgroud)
我不太明白这些"错误"评论是指什么?这是否意味着我不应该这样定义一个函数f,或者说所有的=,&和,运营商应按照默认方式来使用,没有必要重新定义它们呢?
我试图理解一个程序,其中包括函数f的以下定义
void f(String S, const String& r)
{
}
Run Code Online (Sandbox Code Playgroud)
这里参数中的String代表一个类.我对这两个参数的定义之间的区别感到困惑:"String S"和"const String&r".S应该代表String类的对象,那么r怎么样?
更详细地,f定义为
void f(String S, const String& r)
{
int c1 = S[1]; // c1=s.operator[](1).operator char( )
s[1] ='c'; // s.operator[](1).operator=('c')
int c2 = r[1]; // c2 = r.operator[](1)
r[1] = 'd'; // error: assignment to char, r.operator[](1) = 'd'
}
Run Code Online (Sandbox Code Playgroud)
这段代码片段用于显示运算符如何重载,但这些注释对我没什么帮助.例如,为什么r [1] ='d'是正确的?感谢您帮助理解它.
在"The C++ programming language"一书中,作者给出了以下例子.他提到"缓存需要在可以使用之前填充".在我看来,这就是为什么放置compute_cache_value的功能.但是我不明白string_rep()的功能与它的实现有什么关系.谢谢你的澄清.
class Date{
bool cache_valid;
string cache;
void compute_cache_value( ); //fill cache
// ...
public:
// ...
string string_rep( ) const;
};
string Date:: string_rep( ) const
{
if (cache_valid == false) {
Date* th = const_cast<Date*> (this); // cast away const
th->compute_cache_value( );
th->cache_valid = true;
}
return cache;
}
Run Code Online (Sandbox Code Playgroud)
此外,作者还举例说明了以下内容:
Date d1;
const Date d2;
string s1 = d1.string_rep( );
string s2 = d2.string_rep( );
Run Code Online (Sandbox Code Playgroud)
作者表示第四个例子将显示未定义的行为.我想知道为什么.
在"The C++ Programming Language"一书中,作者给出了以下示例和几个声明.
class Matrix {
double m[4][4];
public:
Matrix( );
friend Matrix operator+(const Matrix&, const Matrix&)
};
Matrix operator+(const Matrix& arg1, const Matrix& arg2)
{
Matrix sum;
for (int i=0; i<4; i++)
sum.m[i][j ]=arg1.m[i][j]+arg2.m[i][j];
return sum;
}
Run Code Online (Sandbox Code Playgroud)
这本书声称
引用允许使用涉及大型对象的常用算术运算符的表达式而无需过多复制.无法使用指针,因为无法重新定义应用于指针的运算符的含义.
我不明白上述陈述中"过度复制"是指什么.并且对于"指针不能被使用因为不可能重新定义应用于指针的运算符的含义"的陈述,我只是完全迷失了.感谢您的解释.
我在C++编程语言一书中看到了以下示例
class Ptr {
X* operator->( );
};
voide f(Ptr p)
{
p->m=7;
X* q1 = p->;
X* q2 = p.operator->();
}
Run Code Online (Sandbox Code Playgroud)
该书声称1)类Ptr的对象可以用于以与指针使用方式非常类似的方式访问类X的成员.2)将对象p转换为指针p.operator - >()不依赖于指向的成员m.这就是operator - >()是一元后缀运算符的意义.
对于第一点,我不明白为什么我们需要这种设计,或者在哪种情况下应该使用这种设计.对于第二点,我对作者想要提供的信息感到困惑.
谢谢.
以下代码片段的输出应该是什么?为什么?
#include <stdio.h>
#include <string.h>
int main()
{
char ch = 'A';
char str[3];
strcpy(str, "ABCDE");
printf("%c", ch);
}
Run Code Online (Sandbox Code Playgroud)