- 博客(11)
- 资源 (1)
- 收藏
- 关注
原创 C++ 成员变量和成员函数分开存储
只有普通成员变量属于对象, 会占用对象的内存(并且 类中一旦声明了普通成员变量,那么类对象的大小, 就是普通成员变量的大小) 静态成员变量, 成员函数, 静态成员函数 都不属于类对象(他们在内存中只保留一份), 所以他们都不占用对象的内存。 综上所述: 成员变量和成员函数是分开存储的。 空对象, 在内存中只占用1个字节。
2024-08-24 14:24:11 15
原创 C++类对象作为类成员
那么在构造的时候, 是先进行本类的拷贝构造, 还是先进行成员中类对象的拷贝构造?构造:(先有局部再有整体,局部组成整体)**C++ 类对象作为类成员**当一个类中有类对象作为类的成员。先进行类成员的构造函数。再进行类成员的析构函数。再进行本类的构造函数。先进行本类的析构函数。
2024-08-24 14:23:39 54
原创 C++静态成员和静态变量
当静态成员函数访问普通成员变量时, 编译器就无法知道, 到底是访问哪个对象的普通成员变量, 从而导致出错。所以只要调用静态成员函数访问静态成员变量, 编译器就知道, 是访问的是内存中唯一的静态成员变量。 和静态成员变量一样,静态成员函数也是有访问权限的, 类外无法访问私有的静态成员函数。 因为静态成员变量是属于类的, 是所有该类的对象所共享的, 在内存中只有一份。 3.静态成员函数可以在类内声明+初始化, 也可以在类内声明, 类外初始化。**静态成员函数注意点1:**
2024-08-24 14:23:04 20
原创 C++ 深浅拷贝
所以就必须使用深拷贝, 新的对象, 在堆区重新开辟一块空间, 将原来对象中堆区的值,拷贝到这块新空间中, 这样两个对象 的两个指针就指向两块不同的堆区, 相互对立, 互不干扰, 在调用析构函数的时候,各自释放自己的堆区, 这样就不会导致出错。在调用析构函数释放堆区内存时, 两个对象都会调用析构函数, 那么析构函数就会被调用两次, 这块堆区内存也就会被释放两次, 从而导致出错。总结: 如果属性有堆区开辟的, 一定要提供自己的构造函数, 防止浅拷贝带来的问题。**C++ 深拷贝与浅拷贝**
2024-08-24 14:21:47 47
原创 C++对象特性
/ error 重定义错误, 编译器会认为 Base(b4) 等价于 Base b4, 而b4已经被定义了。// 匿名对象 特点, 当前行执行结束后, 系统会理解回收掉匿名对象, 因为后续没法调用这个对象(没有名字怎么调用)// 有参构造 等价与 Base b6=Base("hh",22);Base b3();cout<<"默认拷贝构造"<<endl;cout<<"有参构造"<<endl;cout<<"拷贝构造"<<endl;
2024-08-23 23:18:30 70
原创 程序内存分区模型
cout<<"字符串字面量常量hello的地址:"<<(intptr_t)&"hello"<<endl;cout<<"全局字符串常量e2的地址:"<<(intptr_t)&e2<<endl;cout<<"局部字符串常量e的地址:"<<(intptr_t)&e<<endl;cout<<"全局变量b的地址:"<<(intptr_t)&b<<endl;cout<<"局部常量f的地址:"<<(intptr_t)&f<<endl;cout<<"全局常量g的地址:"<<(intptr_t)&g<<endl;
2024-08-23 21:51:13 157
原创 C++函数模板
/ 编译器优先调用模板,因为调用普通函数, 编译器还要进行隐式类型转换, 还不如直接调用模板进行自动类型推导来的快, 所以编译器走捷径, 就直接调用函数模板。template<typename T> // 声明一个模板, 告诉编译器看到后面的代码中含有T时, 不要报错, T是一个通用的数据类型。// 这里必须要确定模板的数据类型(即便没有使用模板, 也要告诉编译器数据类型)// 1.函数模板调用时, 如果利用自动类型推导, 不会发生隐式类型转换。// 如果普通函数可用, 优先调用普通函数。
2024-08-22 22:39:59 303
原创 TCP/IP模型与OSI模型对比
就对应于OSI模型中的, 物理层, 数据链路层,负责物理地址的管理和数据帧的传输。 主要管理物理(MAC)地址和负责数据帧的传输入, 主要协议有ARP协议。 主要提供网络服务和应用接口, FTP, HTTP等协议。 主要负责路径选择和管理IP地址, 主要协议有IP协议。 负责端到端的传输, 主要协议有TCP/UDP协议。
2024-08-21 09:14:39 246
原创 C/C++中线程的使用
上下文切换: 当一个任务在cpu时间片使用完后,还没有执行完毕, 就会保存此时执行的状态, 等到下次再获得cpu时, 就从保存的状态继续向后执行, 任务从保存到再次加载的过程就是一次上下文切换。retval: 当线程退出时,可以传入的数据, 主线程调用pthread_join()回收子线程的时候, 就可以接收到子线程传入的retval数据,如果不需要传入数据, 就直接设为NULL。// 返回当前调用该函数的线程ID。也就是说, 如果主线程先执行完毕, 退出的时候, 子线程也跟着被销毁, 无法继续执行。
2024-08-20 23:57:33 758
原创 IO多路复用epoll
因为边沿模式下, 在新数据到来时,只会通知一次, 所有 这就要求, 用户保证要在得到通知后,要把缓冲区的数据全部读完, 这就需要循环进行read操作, 但是,当最后读完缓冲区的数据后, 没有数据可读时, read就会默认陷入阻塞, 这就使得服务器的整个执行流程无法继续进行下去, 所以必须将文件描述符设置为非阻塞, 这样当循环读数据, 将数据读完后, 就会检测到缓冲区数据已读完, 就不会陷入阻塞。写事件: 当写缓冲区可写, 写事件只会触发一次 当缓冲区被写满后, 再次变为可写, 写事件才会再次被触发。
2024-08-20 22:32:50 889
原创 IO多路复用select
首先, 将要检测的fd_set(读集合,也可以理解为一张文件描述符的表)拷贝到内核中, 由内核来遍历fd_set中的每一位, 如果fd_set中对应文件描述符的标志位为0, 则说明该处的文件描述符不需要检测, 内核就会跳过这个文件描述符, 如果fd_set中的文件描述符的标志位为1, 则说明该处的文件描述符需要进行检测, 内核就会检测这个文件描述符的读缓冲区, 如果读缓冲区有数据, 则该处的状态不变,标志位还为1, 如果读缓冲区没有数据, 那么该处的标志位就会被内核置为0。
2024-08-20 20:28:40 734
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人