我来自C++,所以有一个我不太了解的java特性.我已经读过必须使用关键字创建所有对象new,但基元除外.现在,如果编译器可以识别基本类型,并且不允许您创建一个没有调用其构造函数的对象new,那么拥有该关键字的原因是什么new?有人可以提供两行代码的例子,除了存在new,编译和具有不同的含义/结果相同吗?
只是为了澄清多余的意思,希望能让我的问题更加清晰.不new添加任何东西?语言是否可以在没有new通过构造函数实例化对象的情况下表达?
struct MyClass
{
std::array<int, 10> stdArr;
MyClass() : stdArr()
{}
};
MyClass c;
Run Code Online (Sandbox Code Playgroud)
问题:
c.stdArr零初始化?我自己的矛盾答案:
它是零初始化的:
std::array希望表现得像一个c-array.如果在上面的例子中stdArr是一个c-array,它将stdArr()在初始化列表中进行零初始化.我希望member()在初始化列表中写入初始化对象.
它不是零初始化的:
std::array 通常只有一个成员,在我的情况下 int[10] _Elems;int[N]都不是默认初始化的.std::array 是一种聚合类型,暗示它是默认构造的._Elems,我认为它不是零初始化.std::array根据C++ 11标准,正确的行为是什么?
假设一个方法返回这样的东西
boost::optional<SomeClass> SomeMethod()
{...}
Run Code Online (Sandbox Code Playgroud)
现在假设我有类似的东西
boost::optional<SomeClass> val = SomeMethod();
Run Code Online (Sandbox Code Playgroud)
现在我的问题是如何从val中提取SomeClass?
所以我可以这样做:
SomeClass sc = val ?
Run Code Online (Sandbox Code Playgroud) 考虑以下简单示例,我用它std::equal_to来比较两个std::pair<std::string, unsigned>.它operator new被重载,以便在分配时打印一条消息(此处为实时代码):
#include <functional>
#include <string>
#include <iostream>
// overloaded to see when heap allocations take place
void* operator new(std::size_t n)
{
std::cout << "Allocating " << n << std::endl;
return malloc(n);
}
int main()
{
using key_type = std::pair<std::string, unsigned>;
auto key1 = std::make_pair(std::string("a_______long______string______"), 1);
auto key2 = std::make_pair(std::string("a_______long______string______"), 1);
std::cout << "Finished initial allocations\n\n" << std::endl;
std::equal_to<key_type> eq;
eq(key1, key2); // how can this cause dynamic allocation???
}
Run Code Online (Sandbox Code Playgroud)
我看到的信息是 …
我经常-1在从函数返回时使用无效值类型,其中输入产生不正确的输出.例如,-1可以返回索引超出范围而不是抛出异常的索引函数.但是当编写具有负值的函数作为可能的返回类型时,此技术不起作用.在这种情况下返回无效类型值的正确方法是什么?
我主要使用的技术是将返回类型设置为类型*int,并返回指针NULL.但是,这要求所有返回值都是指针类型,这似乎是函数的额外开销.在这种情况下,是否有可接受的返回值标准?
我还没有看到一种既定的方法来记忆一个带有关键字参数的函数,即类型的东西
def f(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
因为通常一个memoizer有一个dict缓存给定输入参数集的结果,并且kwargs是一个dict因此不可用的.我在这里讨论后尝试过使用
(args, frozenset(kwargs.items()))
Run Code Online (Sandbox Code Playgroud)
作为缓存的关键dict,但这仅在值为kwargshashable 时才有效.此外,正如下面的答案中所指出的那样,frozenset它不是有序的数据结构.因此,此解决方案可能更安全:
(args, tuple(sorted(kwargs.items())))
Run Code Online (Sandbox Code Playgroud)
但它仍然无法应对不可清除的元素.我所看到的另一种方法是使用string的表示kwargs在缓存中的关键:
(args, str(sorted(kwargs.items())))
Run Code Online (Sandbox Code Playgroud)
我看到的唯一缺点是散列可能非常长的字符串的开销.据我所知,结果应该是正确的.有人能发现后一种方法有什么问题吗?下面的答案之一指出,这假定了关键字参数值的函数__str__或__repr__函数的某些行为.这似乎是一个显示阻止.
还有另一种更成熟的实现备忘的方法,可以应对**kwargs和不可消除的论证价值吗?
我想使用复杂数字的C++.因此我包括在内#include <complex>.现在我的问题是:如何声明一个变量?(那么调用的格式是什么1 + i呢?)
提前致谢 :-)
我在linux中编译我的程序 - 它有以下几行:
std::sqrt((double)num);
Run Code Online (Sandbox Code Playgroud)
在Windows上没关系,但是在linux上我得到'sqrt'不是'std'的成员我有一个包括math.h
有什么问题吗?
我有一个std::vector.我检查它的大小是6,但是当我尝试访问vec[6]以检查它是否会出错时,我得到的不是错误而是一些数字.它不应该出错吗?
编辑:类似于:
struct Element
{
std::vector<double> face;
};
int main()
{
Element elm;
.... // insert 6 elements into elm.face
std::cout << elm.face.size() << std::endl; // answer is 6
std::cout << elm.face[6] << std::endl; // answer is some number
}
Run Code Online (Sandbox Code Playgroud) 众所周知,在C++中,字符串文字是不可变的,修改字符串文字的结果是未定义的.例如
char * str = "Hello!";
str[1] = 'a';
Run Code Online (Sandbox Code Playgroud)
这将带来不确定的行为.
除了字符串文字放在静态内存中.因此它们存在于整个程序中.我想知道为什么字符串文字有这样的属性.