在创建堆栈时指定数据类型时,我遇到了两种不同的实现。
stack<string>* stringStack = new Stack<string>();
Stack<string> stringStack = new Stack<string>();
指向堆栈的指针是什么?
例如,我的教授为我们提供了代码:
stack<std::string>* stringStack = new Stack<std::string>();
stringStack->push(“Jim”);
std::string top = stringStack->peek();
std::cout << top << “ is at the top of the stack \n”;
在这里,我的教授使用了第一种情况。
当我在线搜索解决方案时,我找到了代码
Stack<string> stringStack = new Stack<string>();
stringStack.push(17);
int a = stringStack.pop();
我对两者之间的区别感到困惑。 如果有人可以向我解释两者之间的区别,那么有没有就可以了!
答案 0 :(得分:1)
当我在线搜索解决方案时
那是您的问题。不要搜索互联网并复制/粘贴您不了解的代码。那是你毕业后的。
我找到了密码
Stack<string> stringStack = new Stack<string>(); stringStack.push(17); int a = stringStack.pop();
那不会编译。 new
用于进行动态分配,并返回 pointer 。左侧(Stack<string> stringStack
)上没有指针。
您看到的“神秘的” *
注释在左侧(以正确的代码表示)是一个指针。如果它不是类型的一部分,则它是一个 dereference 运算符,表示“查找此指针指向的内容”。
动态内存分配必须成对完成……new
和delete
,否则会泄漏。简要演示:
{ // a scope begins
int x = 10; // not a pointer; stack allocated
} // a scope ends, integer automatically is gone
{ // a scope begins
int *px = new int; // px points to integer-sized memory box
*px = 10; // put 10 into that box
} // a scope ends, you didn't delete px, you leaked memory
这里讨论了是否应该动态分配某些东西的问题,也许您会在其中找到一些有价值的东西:
Why should I use a pointer rather than the object itself?
但是,如果您的教授确实在教“现代C ++”,那么请您进一步困惑,然后会警告您不要随意使用原始指针:
What is a smart pointer and when should I use one?
我将重申,您自己可以做的最好的事情就是不要尝试通过在Internet上搜索解决方案来实现捷径。从一开始就遵循您的课程工作,如果您觉得自己的课程或教授缺乏,那么可以通过自己a good book来补充自己的教育。