1?CService{CNetAddr(), GetListenPort()} 这是什么写法 函数不都是圆括号为什么这里是花括号?
对象初始化
使用花括号初始化列表的语法,用于创建一个 CService?对象并进行初始化。
在这个语法中,花括号内部是一个逗号分隔的列表,用于指定对象的初始化值。在这个例子中,CService?对象的初始化值是一个空的 CNetAddr?对象和 GetListenPort()?函数的返回值。
使用花括号的初始化列表语法可以方便地为对象的成员变量赋初值,而不必显式调用构造函数。这种语法在 C++11 标准引入,并成为了一种常见的初始化方式。
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
string name;
int age;
string address;
// 构造函数
Person(const string& n, int a, const string& addr)
: name(n), age(a), address(addr) {}
};
int main() {
// 使用花括号初始化列表创建 Person 对象
Person p = { "Alice", 25, "123 Main St" };
// 打印 Person 对象的属性
cout << "Name: " << p.name << endl;
cout << "Age: " << p.age << endl;
cout << "Address: " << p.address << endl;
return 0;
}
2?为什么要向前声明?为什么写了两个class ArgsManager
代码顺序执行, 后面定义的类被 前行代码使用, 就要提前声明使用的类
class ArgsManager;
class ArgsManager
{
public:
std::vector<std::string> GetArgs(const std::string& strArg) const;
};
// 前向声明
class B;
class A {
public:
void DoSomethingWithB(B* b);
};
class B {
public:
void DoSomethingWithA(A* a);
};
// 在成员函数的实现中,可以使用指向另一个类的指针或引用
void A::DoSomethingWithB(B* b) {
// 使用类 B 的成员函数
b->DoSomethingWithA(this);
}
void B::DoSomethingWithA(A* a) {
// 使用类 A 的成员函数
a->DoSomethingWithB(this);
}
3?为什么自己写的要用双引号 不用尖括号?
在C++中,使用尖括号 `< >` 引入头文件通常用于引入标准库头文件或系统级的头文件。这是因为标准库头文件通常位于系统的标准库路径下,编译器会在这些路径中查找这些头文件。
对于自定义的头文件,通常使用双引号 `"` 来引入。这是因为自定义的头文件通常位于项目的特定目录下,而不是系统的标准库路径。使用双引号可以告诉编译器在当前目录或项目的相关目录中查找这些头文件。
然而,使用尖括号 `< >` 引入自定义头文件也是合法的,但它通常用于引入系统级别的头文件,如操作系统提供的头文件或第三方库的头文件。
总结起来,使用尖括号 `< >` 引入头文件通常用于标准库或系统级的头文件,而使用双引号 `"` 引入头文件通常用于自定义的头文件。这是一种约定俗成的写法,但并不是强制性的规定。
4?namespace命名空间和匿名命名空间
namespace common {
// 在 common 命名空间中定义公共函数和变量
void foo() {
// 函数实现
}
int commonVariable;
}
namespace {
// 在匿名命名空间中定义私有函数和变量
void privateFunction() {
// 函数实现
}
int privateVariable;
}
int main() {
common::foo(); // 可以访问 common 命名空间中的函数
common::commonVariable = 42; // 可以访问 common 命名空间中的变量
// privateFunction(); // 无法访问匿名命名空间中的函数,因为它对外部文件不可见
// privateVariable = 10; // 无法访问匿名命名空间中的变量,因为它对外部文件不可见
return 0;
}