小编Alo*_*ave的帖子

迭代器失效的规则

在STL容器类(Vector,Dequeue,list,map,multimap,set,multiset)上操作时,Iterator失效的常用规则是什么?是否有可能对C++ STL程序员在处理容器及其迭代器时必须注意的一些一般规则/指南进行分类和总结?

c++ iterator stl invalidation

5
推荐指数
1
解决办法
2181
查看次数

是否应该敏锐而有意识地尝试尽可能推迟变量定义?

在他的书中Effective C++ Scott Meyers提出了一个有趣的指导方针,

第26项:尽可能推迟变量定义.它提高了程序清晰度并提高了程序效率.

他提出的支持上述论点的论点是,无论何时创建或破坏变量,我们都会为变量的构造和破坏承担一些成本.
我们可能有多个控制流,其中我们可以从函数返回而不使用早期定义的变量(在函数的开头),因此可能不必要地产生未使用变量的创建成本.

这一切似乎都是合乎逻辑的,而且确实是一种很好的做法.来自c背景我倾向于在功能块的开头声明我的所有变量.也许它仅仅是c背景,但我也觉得在函数中的一个地方的所有声明都提供了简单和更好的可读性.

所以问题是你们当中有多少人在日常节目中真正遵循这样的做法,或者试图遵循这样的做法仅仅是一种过度杀伤力.

c++ performance

5
推荐指数
3
解决办法
623
查看次数

未命名的命名空间

有以下代码:

#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)

c++ namespaces g++

5
推荐指数
2
解决办法
5399
查看次数

C++中某些类型的指针之间的距离限制是什么?

假设我有两个指向键入的指针T:

T* first = ...// whatever
T* second = ... //whatever else
Run Code Online (Sandbox Code Playgroud)

我可以确定这两个指针之间的距离永远不会超过:

((size_t)(-1))/sizeof(T)

c++ pointers

5
推荐指数
1
解决办法
251
查看次数

来自Base Ctor的Pure Virtual Function调用

请考虑以下示例代码:

#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,Line3Line4.

我理解:Line1给出编译错误,因为无法从ctor调用纯虚函数.

问题:

  1. 为什么Line2Line4没有给出compilation error在同样的理由 …

c++ constructor runtime-error linker-errors pure-virtual

5
推荐指数
2
解决办法
1492
查看次数

指针作为成员或引用作为成员

我需要在c ++ linux中做一个澄清.

我有class C1另一个class C2.C1将有参考C2.

class C1
{

   C2 &obj ;

}
Run Code Online (Sandbox Code Playgroud)

我在考虑两个选择,

  1. 直接持有C2as 的引用C2 &obj;
  2. 创建指针C2,如c2* obj;

哪个好?它有什么区别?何时选择?

c++

5
推荐指数
1
解决办法
465
查看次数

在 OOP 中使用 Union

联合可以像类和结构一样用作类型(有一些限制)。它可以有成员函数。它可以用作 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 构造,为什么标准允许联合中的成员函数?
请发布具有特定推理的答案,并且请不要发布我不这么认为的答案,如果没有很好的理由推理

c++ unions language-lawyer

5
推荐指数
1
解决办法
1764
查看次数

为什么将静态的类内初始化成员传递给采用const引用的函数需要成员具有定义?

这是基于此处提出的原始问题.

[详细]:以下是评论中要求的相关问题

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::periodconst int&需要period必须定义的函数的函数呢?
知道,这将是非常有帮助的,

  • 理由是什么?
  • 标准是否明确指定了这些方案,还是从更通用的引用推断出这些方案?

c++ static c++11

5
推荐指数
1
解决办法
256
查看次数

通过new和allocator分配内存有什么区别

通过new/ malloc和内存分配有什么区别allocator

为什么我们永远需要载体的独立内存分配器,如果我们的选择newmalloc

c++ memory-management stl allocator

5
推荐指数
1
解决办法
649
查看次数

当我们有深拷贝和浅拷贝时为什么懒复制?

我们有浅拷贝深拷贝,当我们想要用C++复制对象时,他们可以为我们完成这项工作.那么,
什么是懒复制
这是程序员或编译器自己做的事情吗?
什么是懒惰副本有利的编程方案?

c++

4
推荐指数
2
解决办法
2922
查看次数