如果'Test'是一个普通的类,那么之间有什么区别:
Test* test = new Test;
Run Code Online (Sandbox Code Playgroud)
和
Test* test = new Test();
Run Code Online (Sandbox Code Playgroud) 最近我见过如下例子:
#include <iostream>
class Foo {
public:
int bar;
Foo(int num): bar(num) {};
};
int main(void) {
std::cout << Foo(42).bar << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这奇怪: bar(num)
意味着什么?它似乎初始化成员变量,但我以前从未见过这种语法.它看起来像一个函数/构造函数调用,但对于一个int
?对我没有任何意义.也许有人可以启发我.而且,顺便说一下,还有其他类似的深奥语言功能,你永远不会在一本普通的C++书中找到它吗?
在过去的几年里,我并没有非常使用过C语言.当我今天读到这个问题时,我遇到了一些我不熟悉的C语法.
显然在C99中,以下语法有效:
void foo(int n) {
int values[n]; //Declare a variable length array
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个非常有用的功能.有没有关于将它添加到C++标准的讨论,如果是这样,为什么它被省略?
一些潜在的原因:
C++标准规定数组大小必须是常量表达式(8.3.4.1).
是的,当然我意识到在玩具示例中可以使用std::vector<int> values(m);
,但这会从堆中分配内存而不是堆栈.如果我想要一个多维数组,如:
void foo(int x, int y, int z) {
int values[x][y][z]; // Declare a variable length array
}
Run Code Online (Sandbox Code Playgroud)
该vector
版本变得很笨拙:
void foo(int x, int y, int z) {
vector< vector< vector<int> > > values( /* Really painful expression here. */);
}
Run Code Online (Sandbox Code Playgroud)
切片,行和列也可能遍布整个内存.
看一下comp.std.c++
这个问题的讨论很明显,这个问题在争论的两个方面都有一些非常重要的名字引起争议.毫无疑问,a std::vector
总是更好的解决方案.
我有一个函数,我想作为一个参数,一个可变大小的2D数组.
到目前为止我有这个:
void myFunction(double** myArray){
myArray[x][y] = 5;
etc...
}
Run Code Online (Sandbox Code Playgroud)
我在代码中的其他地方声明了一个数组:
double anArray[10][10];
Run Code Online (Sandbox Code Playgroud)
但是,调用myFunction(anArray)
给了我一个错误.
当我传入数组时,我不想复制数组.所做的任何更改都myFunction
应该改变数据的状态anArray
.如果我理解正确,我只想作为参数传入指向2D数组的指针.该函数还需要接受不同大小的数组.例如,[10][10]
和[5][5]
.我怎样才能做到这一点?
您能否请C++开发人员详细介绍RAII是什么,为什么重要,以及它是否与其他语言有任何关联?
我做知道一点点.我相信它代表"资源获取是初始化".但是,这个名称并不符合我对RAII的理解(可能不正确):我得到的印象是RAII是一种初始化堆栈中对象的方式,当这些变量超出范围时,析构函数会自动被称为导致资源被清理.
那么为什么不称为"使用堆栈触发清理"(UTSTTC :)?你怎么从那里到"RAII"?
你怎么能在堆栈上创建一些东西来清理堆上的东西呢?此外,是否有不能使用RAII的情况?你有没有发现自己希望收集垃圾?至少一个垃圾收集器,你可以使用一些对象,同时让其他人管理?
谢谢.
这两个声明之间有什么区别吗?
int x[10];
Run Code Online (Sandbox Code Playgroud)
与
int* x = new int[10];
Run Code Online (Sandbox Code Playgroud)
我认为前一个声明(如后一个声明)是一个指针声明,两个变量都可以相同.这是否意味着它们本质上是一样的?
[expr.new]
C++的5.3.4 2月草案给出了一个例子:
new(2,f) T[5]
导致打电话operator new[](sizeof(T)*5+y,2,f)
.这里,x和y是非负的未指定值,表示数组分配开销; new-expression的结果将从返回的值中抵消此数量
operator new[]
.这种开销可以应用于所有数组新表达式,包括那些引用库函数operator new[](std::size_t, void*)
和其他放置分配函数的表达式.开销的数量可能因新的一次调用而异.- 末端的例子 ]
现在来看以下示例代码:
void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];
Run Code Online (Sandbox Code Playgroud)
根据上面的引用,第二行将new (buffer) std::string[10]
在内部调用operator new[](sizeof(std::string) * 10 + y, buffer)
(在构造单个std::string
对象之前).问题是如果y > 0
,预分配的缓冲区太小了!
那么我如何知道在使用数组放置时预先分配多少内存?
void* buffer = malloc(sizeof(std::string) * 10 + how_much_additional_space);
std::string* p = ::new (buffer) std::string[10];
Run Code Online (Sandbox Code Playgroud)
或者标准某处是否保证y == 0
在这种情况下?报价再次说:
这种开销可以应用于所有数组新表达式,包括那些引用库函数
operator …
Bjarne Stroustrup在C++编程语言中写道:
无符号整数类型非常适合将存储视为位数组的用途.使用无符号而不是int来再获得一位来表示正整数几乎不是一个好主意.通过声明无符号变量来确保某些值为正的尝试通常会被隐式转换规则所取代.
size_t似乎是无符号的"再获得一位代表正整数".那么这是一个错误(或权衡),如果是这样,我们应该在我们自己的代码中最小化它的使用吗?
Scott Meyers的另一篇相关文章就在这里.总而言之,他建议不要使用无符号in接口,无论值是否总是正数.换句话说,即使负值没有意义,也不一定要使用无符号.
如果我想构建一个非常简单的数组
int myArray[3] = {1,2,3};
Run Code Online (Sandbox Code Playgroud)
我应该用std::array
吗?
std::array<int, 3> a = {{1, 2, 3}};
Run Code Online (Sandbox Code Playgroud)
使用std :: array比使用常规的有什么好处?性能更高吗?更容易处理复制/访问?