在类中,变量通常被私有化以用于封装,并且将变量限制到特定范围允许更好的错误控制和更少的错误.这是有道理的,因为可以访问变量的位置越少,该变量发生错误的位置就越少.
但是,我总是看到变量变为私有,然后使用getter和setter函数来检索该值(有时甚至是指向该变量的指针!).例如int a是私人防止公共访问,但后来getA()并setA()允许他们直接访问.
那么,getter函数和setter函数是否违背了它的私有性?我的意思是具有访问器功能的私有变量与公共变量相同,只有访问它们的代码才会发生变化.(object.variable vs object.getVariable())
是否有人使用访问器函数将变量设为私有?与公开相比有什么优势吗?
我说的是一般的编程,但主要是C语言(即C,C++,C#,Obj-C).
我会听一些人说__fastcall比这更快__cdecl并且__stdcall导致它将两个参数放入寄存器,而不是其他一个调用; 但是,另一方面,这不是C中使用的标准.
我想知道什么是__fastcall不合适的,就像C中的标准,以及何时我将在我的代码中使用它.
这个非常简单的代码在GCC 6.0中出错:
template<class T>
struct S {
// error: cannot convert 'T' to 'const int' in initialization
static const int b = T{};
};
int main() {
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我使用常规大括号(T()),那么代码就会编译.这是一个错误吗?代码在clang中编译得很好.
我常常需要一个简单的RAII包装器,但我不想为此创建一个全新的类,原因很多,包括时间限制和组织问题.我的快速解决方案如下.
假设我想确保在范围结束时,我想要一个布尔值切换回其原始状态:
bool prevState = currState;
currState = newState;
std::unique_ptr<int, std::function<void(int*)>> txEnder(new int(0), [&prevState](int* p) {
currState = prevState;
delete p;
});
Run Code Online (Sandbox Code Playgroud)
这个解决方案工作正常,但脏部分是必须分配和释放该整数只是为了使unique_ptr工作和破坏时调用自定义析构函数.
有没有一个更清洁的方法来做这个,而不必写一个完整的类,并摆脱new假人int?
我是这门语言的新手,我对内存泄漏有一个基本的疑问.如果我不使用new关键字,是否可能发生泄漏?(即在堆栈中使用我的变量并使用数据容器std::vector)
我应该担心这个问题吗?
如果是这种情况,有人可以给我一个例子,说明在没有动态分配内存的情况下造成泄漏吗?
考虑以下代码片段:
template<typename T, template<typename, typename ...> class A, typename ... Ts>
int a(A<T, Ts...> arg){
return 1; // Overload #1
}
template<typename A>
int a(A arg) {
return 2; // Overload #2
}
template<typename T>
struct S{};
int main() {
return a(S<int>());
}
Run Code Online (Sandbox Code Playgroud)
在a使用模板类的实例调用函数时,我希望编译器选择更特殊的函数重载#1。根据编译器资源管理器的说法,直到版本17的clang,gcc和intel确实选择了#1重载。相反,后来的intel编译器版本(18和19)选择#2重载。
代码定义不正确吗?还是最新的intel编译器版本错误?
让我们有变量
char *s;
我知道如果它在全局范围内声明,它的值应为0;
如果它在本地范围内声明,则其值未定义(尽管可能为0).
我在测试中有一个问题听起来像'定义为指针的值是什么
char* s
Run Code Online (Sandbox Code Playgroud)
a)null
b)空字符串
c)未定义
我真的很困惑我应该选择什么答案,因为如果它在全局范围内声明,那么该值将为null(我猜).如果它在本地范围内声明,未定义(虽然当我尝试它为零时),当我尝试cout它时,没有打印任何内容(没有分段错误,为什么?),这意味着它是一个空字符串(或者是cout那么棒?).
我对编码很新,我正在尝试构建一个openframework插件的示例项目,称为ofxReprojection.我去的时候:
cd /Users/Macbookpro/Documents/openframeworks/addons/ofxReprojection/example-ofxKinect
Run Code Online (Sandbox Code Playgroud)
然后
make
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
ld: unknown option: -rpath=./libs
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [bin/example-ofxKinect] Error 1
make: *** [Release] Error 2
Macbooks-MacBook-Pro:example-ofxKinect Macbookpro$
Run Code Online (Sandbox Code Playgroud)
我有Mac OS 10.7.5.
为了艺术,我希望有人可以提供帮助:)
的UINT8_C宏在“stdint.h”中定义,用下面的说明书:宏UINTN_C(value)应扩展到对应于该类型的整数常量表达式uint_leastN_t。
但是,在一般情况下,实现方式有所不同:
#define UINT8_C(value) ((uint8_t) __CONCAT(value, U)) // AVR-libc
#define UINT8_C(x_) (static_cast<std::uint8_t>(x_)) // QP/C++
#define UINT8_C(c) c // GNU C Library
Run Code Online (Sandbox Code Playgroud)
前两个实现看起来大致相同,但是第三个实现的行为有所不同:例如,以下程序1使用AVR-libc和QP / C ++进行打印,但是-1使用glibc(因为有符号值的右移会传播符号位)。
std::cout << (UINT8_C(-1) >> 7) << std::endl; // prints -1 in glibc
Run Code Online (Sandbox Code Playgroud)
display的实现UINT16_C显示相同的行为,但不显示UINT32_C,因为其定义包括U后缀:
#define UINT32_C(c) c ## U
Run Code Online (Sandbox Code Playgroud)
有趣的是,由于有错误报告,glibc 在2006年UINT8_C更改了定义。先前的定义为,但是由于整数提升规则而产生了错误的输出()。#define UINT8_C(c) c ## Ufalse-1 < UINT8_C(0)
根据标准,所有三个定义是否正确?这三个实现之间是否还有其他区别(除了负数的处理)?
我听说std::iterator在 C++17 中不推荐使用。
例如,像功能<algorithm>,更可能我们要使用begin()和end()它返回迭代器对象,如成员函数std::string,std::vector等等。
或者像基于范围的 for 循环,我们需要的地方begin()以及end()返回迭代器的地方。
因此,如果std::iterator基类被弃用,我们是否应该使用成员函数,如begin()和end()或使用 STL 中需要迭代器的其他函数?