C++实现TCP套接字类时用成员变量设置address.sin_port失效原因求解
问题原因分析
- 核心原因是变量名遮蔽(Name Hiding):你在构造函数内部声明的
uint16_t _port、struct sockaddr_in _address都是构造函数的局部变量,和类的同名成员变量完全是两个独立的变量。 - 构造函数内给局部
_port赋值的操作,不会修改类的成员变量_port,构造函数执行结束后,这两个局部变量就会被销毁,完全不会影响成员变量的值。 - 调用无参
bindSocket方法时,方法内部访问的_port、_address是类的未初始化POD类型成员,这类未初始化变量的值是未定义的,你场景下刚好取到0值所以输出为0,属于典型的未定义行为。 - 第二段代码能正常运行的原因是你直接把端口作为参数传入
bindSocket,方法内部直接使用传入的参数赋值,没有用到未初始化的成员_port,所以结果符合预期。
修复建议:如果类已经定义了
_port、_address成员,构造函数内不需要重新声明同名局部变量,直接给成员赋值即可,也可以通过this指针明确指定访问成员变量避免遮蔽问题:
ServerSocket::ServerSocket(uint16_t port_) { // 直接给成员变量赋值,不要加类型声明 this->_port = port_; // 初始化地址结构体其余字段 memset(&this->_address, 0, sizeof(this->_address)); this->_address.sin_family = AF_INET; this->_address.sin_addr.s_addr = htonl(INADDR_ANY); this->bindSocket(); } int ServerSocket::bindSocket() { _address.sin_port = htons(_port); std::cout << _address.sin_port << std::endl; // 后续绑定逻辑 }
内容的提问来源于stack exchange,提问作者Mediumrär
相关产品推荐
相关产品推荐

