我知道字符串文字是对象。根据
https://zh.wikibooks.org/wiki/Java_Programming/Classes_Objects_and_Types
创建对象时,也会创建对该对象的引用。只能通过此对象引用才能在Java中直接访问该对象。该对象引用具有分配给它的类型。当将对象引用作为参数传递给方法时,我们需要这种类型。
但是,当我们有文字访问String方法时,是否违反了这一规定?
例如:
System.out.println("Literal".toUpperCase());
Run Code Online (Sandbox Code Playgroud)
这不是直接访问对象吗?与通过引用访问对象相反。
例如:
String x = "Literal";
System.out.println(x.toUpperCase());
Run Code Online (Sandbox Code Playgroud) 在模板类成员函数中指定返回类型时,我们必须具体,例如:“类型 std::vector不是类型,std::vector<int>是”。
那么为什么这两个例子都能编译呢?如果我不在<T>第一个示例中包含 the ,它甚至不应该被视为一种类型,对吗?
template<typename T>
Queue<T>::Queue(const Queue& st) {}
template<typename T>
Queue<T>::Queue(const Queue<T>& st) {}
Run Code Online (Sandbox Code Playgroud)
鉴于此模板类
template<typename T>
class Queue {
private:
struct Node {
Node (T value) : value(value), next(nullptr) {}
Node (T value, Node* next) : value(value), next(next) {}
T value;
Node* next;
};
Node* head;
size_t sz;
void cleanList();
public:
Queue();
Queue(const Queue& st);
Queue& operator=(const Queue& st);
~Queue();
size_t size() const noexcept;
bool isEmpty() const noexcept;
T& …Run Code Online (Sandbox Code Playgroud) 根据https://www.learncpp.com/cpp-tutorial/44-implicit-type-conversion-coercion/
“关于促销活动,要记住的重要一点是,促销活动始终是安全的,不会造成数据丢失。”
但是https://www.geeksforgeeks.org/type-conversion-in-c/指出:
“隐式转换可能会丢失信息,符号可能会丢失(将符号隐式转换为无符号),并且会发生溢出(将long long隐式转换为float时)。”
我知道隐式转换是安全的,但我看不出不会造成数据丢失。哪个正确?
根据https://en.cppreference.com/w/cpp/language/injected-class-name
在类作用域中,当前类的名称被视为公共成员名称;这称为注入类名。名称的声明点紧跟在类定义的左大括号之后。
int X;
struct X {
void f() {
X* p; // OK. X refers to the injected-class-name
::X* q; // Error: name lookup finds a variable name, which hides the struct name
}
};
Run Code Online (Sandbox Code Playgroud)
那么代码中到底发生了什么?是X* p变成了X::X* p?
给定一个带有嵌套 Node 结构的模板类 Queue。
为什么这里的返回类型需要 typename ?
template<typename T>
typename Queue<T>::Node* Queue<T>::test() {}
Run Code Online (Sandbox Code Playgroud)
模板类 Queue 中嵌套的 struct Node 将在Queue<T>::没有 typename的范围内。
根据我在哪里以及为什么必须放置“模板”和“类型名称”关键字?:
我们决定编译器应该如何解析它。如果 t::x 是一个依赖名称,那么我们需要在它前面加上 typename 前缀以告诉编译器以某种方式解析它。
但我不明白为什么使用 typename 是合理的?
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> bfs;
if (root != nullptr) bfs.push(root);
vector<vector<int>> sol;
vector<TreeNode*> temp;
vector<int> indivSol;
while (!bfs.empty()) {
int currSz = bfs.size();
for (int i = 0; i < currSz; i++) {
temp.push_back(bfs.front());
bfs.pop();
indivSol.push_back(temp.at(i)->val);
if (temp.at(i)->left != nullptr) bfs.push(temp.at(i)->left);
if (temp.at(i)->right != nullptr) bfs.push(temp.at(i)->right);
}
temp.clear();
sol.push_back(indivSol);
indivSol.clear();
}
return sol;
}
Run Code Online (Sandbox Code Playgroud)
我知道外部 while 循环将运行n时间(n即树中的节点数),但是内部for循环会使解决方案O(n^2)及时运行吗?由于一棵树2^n在级别上最多有节点n,因此currSz可以从1 to 2 to 4 to 8 to …
根据https://docs.microsoft.com/zh-cn/cpp/cpp/constexpr-cpp?view=vs-2019
“ constexpr表示该值或返回值是恒定的,并且,如果可能,在编译时进行计算。”
此外,constexpr和静态constexpr全局变量之间的区别
“在变量声明中,constexpr隐含const,并且默认情况下,名称空间范围内的const变量具有内部链接(因此,添加static不会更改任何内容)。”
我认为这constexpr意味着const隐含static。
但是,这个问题的答案使我感到困惑:什么时候以及为什么在constexpr中使用static?
它指出
- “ constexpr变量不是编译时值”
- “看来,在某些特殊情况下,我们可以受益于静态constexpr变量的静态存储持续时间。”
我有什么误会?
void foo (int i , int k = 7) {
cout << k;
}
int main(){
foo(1, 2);
}
Run Code Online (Sandbox Code Playgroud)
k将输出2.我的问题是,foo以什么顺序初始化参数并获取参数?什么是foo经历的过程2.谢谢
int main()
{
int a;
cout << a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么要输出值 0。我想如果一个变量未初始化,它会输出一个垃圾值。
但是,我也记得听说整数的默认值是 0,所以我有点困惑。
谢谢
我有以下代码片段:
int a = 1;
double b = 3.14;
string c = "hi";
cin >> a >> b >> c;
cout << a << " " << b << " " << c << endl;
Run Code Online (Sandbox Code Playgroud)
如果我进入apple 11 tammy,为什么它会cout:0 3.14 hi而不是:1 3.14 hi?
为什么破坏a时的变化价值cin?