ToB企服应用市场:ToB评测及商务社交产业平台

标题: C++中的一些困惑(长期更新中) [打印本页]

作者: 铁佛    时间: 2024-6-11 17:33
标题: C++中的一些困惑(长期更新中)
C++中的一些困惑


  
   这是个人笔记,记录一些学习过程中没有理解以及容易肴杂的问题与解答
  1. using std::具体命名与using namespace std;

在C++中,使用 using 和 using namespace 都是用来简化代码中命名空间的写法,但它们有差别的影响和使用场景,各有优劣:
  1. cppCopy codeusing std::vector;
  2. using std::cout;
  3. using std::endl;
  4. int main()
  5. {
  6.     vector<int> nums = {1, 2, 3};
  7.     cout << "Hello, world!" << endl;
  8.     return 0;
  9. }
复制代码
  1. cppCopy codeusing namespace std;
  2. int main()
  3. {
  4.     vector<int> nums = {1, 2, 3};
  5.     cout << "Hello, world!" << endl;
  6.     return 0;
  7. }
复制代码
总体来说:推荐使用 using std::具体的类型 的方式来导入特定的名称,因为它可以明白指定要导入的内容,避免了潜在的命名冲突问题,同时保持了代码的清晰性和可维护性。而在大型项目或者有多个命名空间交织的环境下,最好避免使用 using namespace std; 这样的全局命名空间导入方式,以免引起不须要的麻烦。
2. 【int *p[10] 】与 【int (*p)[10]】

  1. int *p[10];  // p 是一个数组,包含了 10 个指向 int 的指针
复制代码
  1. int (*p)[10];  // p 是一个指针,指向一个包含 10 个整数的数组
复制代码
举个例子来比力两者的使用:
  1. int main()
  2. {
  3.     int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  4.     int *p1[10];  // 数组,包含 10 个指向 int 的指针
  5.     p1[0] = arr;  // 将数组 arr 的首地址赋给 p1 的第一个指针
  6.     int (*p2)[10];  // 指针,指向包含 10 个整数的数组
  7.     p2 = &arr;  // 将数组 arr 的地址赋给 p2
  8.     // 使用 p1 访问数组元素
  9.     for (int i = 0; i < 10; ++i) {
  10.         std::cout << *(p1[0] + i) << " ";  // 输出数组元素
  11.     }
  12.     std::cout << std::endl;
  13.     // 使用 p2 访问数组元素
  14.     for (int i = 0; i < 10; ++i) {
  15.         std::cout << (*p2)[i] << " ";  // 输出数组元素
  16.     }
  17.     return 0;
  18. }
复制代码
在上面的例子中,p1 是一个数组,包含了 10 个指向 int 的指针,而 p2 是一个指针,指向一个包含 10 个整数的数组。这两者的使用方式略有差别,因为 p1 中的每个元素都是指针,而 p2 指向的是整个数组对象。
3. main()函数可带参,参从何来?

在 C++ 中,main 函数可以具有带参数的情势,这些参数通常用于接收下令行参数。这些参数是由操作系统在步伐启动时传递给步伐的,并且可以在 main 函数的参数列表中接收到。
标准的 main 函数的声明有两种情势:
  1. int main()
复制代码
或者
  1. int main(int argc, char* argv[])
复制代码
第一种情势是不带参数的,步伐启动时不会接收任何下令行参数。第二种情势是带参数的,此中 argc 表示下令行参数的数目,argv 是一个指向字符指针数组的指针,每个指针指向一个下令行参数的字符串。

例如,以下是一个简朴的示例:
  1. #include <iostream>#include <string>// 编写一个带实参的main函数并运行int main(int argc, char* argv[])
  2. {    // 确保有足够的实参    if (argc != 3) {        std::cerr << "Usage: " << argv[0] << " <arg1> <arg2>" << std::endl;        return 1;  // 返回非零值表示错误退出    }    // 将实参毗连成一个字符串    std::string result = std::string(argv[1]) + " " + std::string(argv[2]);    // 输出毗连后的字符串    std::cout << "Concatenated string: " << result << std::endl;    return 0;}
复制代码
在VS code中编译运行:
执行过程及结果:

4. constexpr函数的返回值可不为常量,那这时constexpr关键字作用是什么?

虽然constexpr函数的返回值并非总是常量,但使用constexpr关键字可以告诉编译器,希望在可能的环境下在编译期间举行求值和优化。这样可以使代码更加灵活并提高性能,特别是在一些需要举行编译期间盘算的场景下,constexpr函数非常有用。
进一步表明:

  1. #include <iostream>// constexpr函数,参数是常量表达式constexpr int add(int a, int b) {    return a + b;}int main()
  2. {    // 在编译期间就可以盘算出结果    // 因为输入参数是常量表达式     constexpr int result = add(10, 20);    std::cout << "Result: " << result << std::endl;    return 0;}
复制代码
5.为什么C++ STL不提供任何“树”容器?

一个讨论:https://www.codenong.com/205945/
6. 函数参数后面的const

  1. void func() const {};
复制代码
是常量成员函数,即在函数内部不会修改对象的成员变量。
endl;
return 0;
}
  1. ## 5.为什么C++ STL不提供任何“树”容器?
  2. 一个讨论:https://www.codenong.com/205945/
  3. ## 6. 函数参数后面的`const`
  4. ```cpp
  5. void func() const {};
复制代码
是常量成员函数,即在函数内部不会修改对象的成员变量。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4