在文件中使用静态函数有什么用处?
它们与文件中的全局函数有何不同?
static int Square(int i)
{
return i * i;
}
Run Code Online (Sandbox Code Playgroud)
VS
int Square(int i)
{
return i * i;
}
Run Code Online (Sandbox Code Playgroud) 请考虑以下代码段:
class A
{
public:
void nonConstFun()
{
}
};
class B
{
private:
A a_;
A * pA_;
public:
void fun() const
{
pA_->nonConstFun();
//a_.nonConstFun(); // Gives const related error
}
};
int main()
{
B b;
b.fun();
}
Run Code Online (Sandbox Code Playgroud)
在这里,我期望编译器在编译时因为缺少常量来调用A::nonConstFun()内部,B::fun()而不管A对象的类型如何.
但是编译器会抱怨该对象,而不是指针.为什么?我在Windows 10上使用VS2017.
这两种文件打开模式有什么区别?
ios:ate将get/put指针位置设置到文件的末尾=>读取/写入将从结束开始,但它与ios :: app有什么不同,它再次以追加模式打开文件...但是当我创建了一个ofstream并在ios中打开它:app模式,put流指针仍然指向开头,然后如何附加工作呢?
另外我理解ifstream,ofstream和fstream是管理底层流缓冲区的高级类.那么它是否意味着即使在ios:app模式我也可以从文件中读取数据?
为了在C++中执行文件IO,我们使用ofstream,ifstream和fstream类.
将文件与流对象相关联的过程称为"打开文件".打开文件时,我们可以指定打开文件的模式.我的查询与ios::out和ios:in模式有关.
当我创建一个ofstream对象并用ios::in模式打开文件时,我能够写入文件,但只有当它已经创建时(如果ios::out模式文件尚不存在,也会创建模式文件).
但是当我创建ifstream对象并使用ios::out模式打开文件时,我能够从文件中读取.
我的问题是当流的类型(/ )本身指定正在执行哪种类型的操作(输入/输出)时,为什么这些模式(ios::in/ ios::out)由语言提供?ifstreamofstream
另外,为什么这种模糊的用法(ofstream有ios::in和ifstream有ios::out)在一种情况下有效并且在另一种情况下失败(尽管只有文件不存在)?
我有两个A和B类,其中B是A的朋友.
如何在UML中显示?
可以使用依赖关系显示它,然后在下面的关系中添加注释吗?
<<Friend>>
Run Code Online (Sandbox Code Playgroud)
B ------------------> A
我知道需要纯虚拟析构函数的情况.我也知道,如果我们不为它们提供实现,它将给我一个链接器错误.我不明白为什么在代码片段中应该是这种情况,如下所示:
int main()
{
Base * p = new Derived;
}
Run Code Online (Sandbox Code Playgroud)
这里没有删除,所以没有调用析构函数,所以不需要它的实现(假设它应该像其他正常的函数一样声明但未定义,链接器只在我们调用它们时才会抱怨)...或者我遗漏了什么?
我需要理解为什么这应该是一个特例?
编辑:基于BoBTFish的评论
这是我的Base和Derived类
class Base
{
public:
Base(){}
virtual ~Base() = 0;
};
class Derived : public Base
{
};
Run Code Online (Sandbox Code Playgroud) 我有一个单链表实现,如下所示:
头
class SinglyLinkedList
{
struct Node
{
Node * _pNext;
int _data;
};
public:
Node * SomeFun(Node * ip1, Node * ip2);
// Some more methods here
};
Run Code Online (Sandbox Code Playgroud)
现在实现这个类的一个方法
CPP
Node * SinglyLinkedList::SomeFun(Node * ip1, Node * ip2)
{
//Some code and return
}
Run Code Online (Sandbox Code Playgroud)
我不理解的奇怪行为是,在编译时,编译器拒绝识别返回类型中的"Node"类型,除非我将其指定为 SinglyLinkedList :: Node.但是可以识别函数参数的相同类型而不明确指定它.理想情况下,我觉得在这两种情况下都不需要这种显式指定,因为Node在同一个类中定义.任何人都可以对此有所了解吗?
在最近实施零规则主题下的超载期刊中,作者描述了我们如何避免编写五个操作符规则,因为编写它们的原因是:
这两个都可以通过使用智能指针来处理.
在这里,我对第二部分特别感兴趣.
请考虑以下代码段:
class Base
{
public:
virtual void Fun() = 0;
};
class Derived : public Base
{
public:
~Derived()
{
cout << "Derived::~Derived\n";
}
void Fun()
{
cout << "Derived::Fun\n";
}
};
int main()
{
shared_ptr<Base> pB = make_shared<Derived>();
pB->Fun();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,正如文章的作者解释的那样,我们通过使用共享指针获得多态删除,这确实有效.
但是,如果我shared_ptr用a 替换unique_ptr,我不再能够观察到多态删除.
现在我的问题是,为什么这两种行为有所不同?为什么不shared_ptr照顾多态删除unique_ptr?
我在某处读到,自c ++ 11以来,隐式声明了析构函数noexcept(true).
从标准部分12.4
没有异常规范的析构函数声明具有与隐式声明的相同的异常规范
但是在标准中没有任何地方可以找到一个部分,其中包含析构函数是隐含的noexcept(true).谁能指出我可以找到这些信息的部分?
我正在开发一个需要处理大量数据(以GB为单位)的应用程序。我不需要任何时候一次获取所有数据。可以对数据进行分段并仅在任何给定实例上处理(从而将其存储到内存中)分段。
我了解到,大多数需要处理大量数据的应用程序通常都是通过使用内存映射文件来完成的。进一步阅读有关内存映射文件的信息,我发现从内存映射文件读取数据/向内存映射文件写入数据的速度比普通文件IO快,因为我们最终使用了高度优化的页面文件算法来执行读写操作。
这是我的查询:
c++ ×9
boost ×1
c++11 ×1
class ×1
const ×1
destructor ×1
exception ×1
file-io ×1
file-mapping ×1
friend ×1
global ×1
iostream ×1
pointers ×1
polymorphism ×1
pure-virtual ×1
rule-of-zero ×1
scope ×1
static ×1
stream ×1
uml ×1