在STL容器类(Vector,Dequeue,list,map,multimap,set,multiset)上操作时,Iterator失效的常用规则是什么?是否有可能对C++ STL程序员在处理容器及其迭代器时必须注意的一些一般规则/指南进行分类和总结?
在他的书中Effective C++ Scott Meyers提出了一个有趣的指导方针,
第26项:尽可能推迟变量定义.它提高了程序清晰度并提高了程序效率.
他提出的支持上述论点的论点是,无论何时创建或破坏变量,我们都会为变量的构造和破坏承担一些成本.
我们可能有多个控制流,其中我们可以从函数返回而不使用早期定义的变量(在函数的开头),因此可能不必要地产生未使用变量的创建成本.
这一切似乎都是合乎逻辑的,而且确实是一种很好的做法.来自c背景我倾向于在功能块的开头声明我的所有变量.也许它仅仅是c背景,但我也觉得在函数中的一个地方的所有声明都提供了简单和更好的可读性.
所以问题是你们当中有多少人在日常节目中真正遵循这样的做法,或者试图遵循这样的做法仅仅是一种过度杀伤力.
有以下代码:
#include <iostream>
using namespace std;
namespace
{
int funkcja()
{
cout << "unnamed" << endl;
return 0;
}
}
int funkcja()
{
cout << "global" << endl;
return 0;
}
int main()
{
::funkcja(); //this works, it will call funkcja() from global scope
funkcja(); //this generates an error
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用g ++.在这种情况下,有没有办法从未命名的命名空间调用函数?可以使用:: function从全局范围调用函数,但是如何从未命名的命名空间调用函数?编译器生成错误:
prog3.cpp: In function ‘int main()’:
prog3.cpp:43:17: error: call of overloaded ‘funkcja()’ is ambiguous
prog3.cpp:32:5: note: candidates are: int funkcja()
prog3.cpp:25:6: note: int<unnamed>::funkcja()
Run Code Online (Sandbox Code Playgroud) 假设我有两个指向键入的指针T:
T* first = ...// whatever
T* second = ... //whatever else
Run Code Online (Sandbox Code Playgroud)
我可以确定这两个指针之间的距离永远不会超过:
((size_t)(-1))/sizeof(T)?
请考虑以下示例代码:
#include <iostream>
using namespace std;
class base
{
public:
base()
{
bar(); //Line1
this->bar(); //Line2
base *bptr = this;
bptr->bar(); //Line3
((base*)(this))->bar(); //Line4
}
virtual void bar() = 0;
};
class derived: base
{
public:
void bar()
{
cout << "vfunc in derived class\n";
}
};
int main()
{
derived d;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码bar()在基类中具有纯虚函数,在派生类中被覆盖.纯虚函数bar()在基类中没有定义.
现在专注于Line1,Line2,Line3和Line4.
我理解:Line1给出编译错误,因为无法从ctor调用纯虚函数.
问题:
为什么Line2并Line4没有给出compilation error在同样的理由 …
我需要在c ++ linux中做一个澄清.
我有class C1另一个class C2.C1将有参考C2.
class C1
{
C2 &obj ;
}
Run Code Online (Sandbox Code Playgroud)
我在考虑两个选择,
C2as 的引用C2 &obj;C2,如c2* obj;哪个好?它有什么区别?何时选择?
联合可以像类和结构一样用作类型(有一些限制)。它可以有成员函数。它可以用作 OOP 构造。
据我所知,联合只是被导入到 C++ 中以保持与 C 的向后兼容性。
在这些年的编程中,我从未像使用类或结构作为 OOP 构造那样使用联合。
Union 是否有任何实际用途作为 OOP 构造(不仅仅是作为数据类型),或者它只是语言的一些残留部分,从来没有用过?
编辑:
该标准绝对允许联合充当 OOP 构造。它允许在联合中使用成员函数。以下代码编译和工作并且符合标准:
union A
{
int a;
int k;
void doSomething(){}
};
int main()
{
A obj;
int i = obj.a;
obj.doSomething();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果标准不应该充当 OOP 构造,为什么标准允许联合中的成员函数?
请发布具有特定推理的答案,并且请不要发布我不这么认为的答案,如果没有很好的理由推理?
这是基于此处提出的原始问题.
[详细]:以下是评论中要求的相关问题
Lippman在p.303上的c ++引子提到:
class Account {
private:
static constexpr int period = 30;
double daily_tbl[period];
}
Run Code Online (Sandbox Code Playgroud)
如果成员仅在编译器可以替换成员的值的上下文中使用,则不需要单独定义初始化的const或constexpr静态.但是,如果我们在无法替换值的上下文中使用该成员,则必须有该成员的定义.
也:
例如,如果我们将Account :: period传递给一个带有const int&的函数,则必须定义period.
那么为什么传递Account::period给const int&需要period必须定义的函数的函数呢?
知道,这将是非常有帮助的,
通过new/ malloc和内存分配有什么区别allocator?
为什么我们永远需要载体的独立内存分配器,如果我们的选择new和malloc?
我们有浅拷贝和深拷贝,当我们想要用C++复制对象时,他们可以为我们完成这项工作.那么,
什么是懒复制?
这是程序员或编译器自己做的事情吗?
什么是懒惰副本有利的编程方案?
c++ ×10
stl ×2
allocator ×1
c++11 ×1
constructor ×1
g++ ×1
invalidation ×1
iterator ×1
namespaces ×1
performance ×1
pointers ×1
pure-virtual ×1
static ×1
unions ×1