成都网站运营公司怎么注册英文网站域名
2026/1/11 4:24:32 网站建设 项目流程
成都网站运营公司,怎么注册英文网站域名,广东装饰网站建设,最新版wordpressC 面向对象、构造函数、初始化列表、引用、string 一、面向过程与面向对象对比 1. 核心思想差异 面向过程#xff1a;以“步骤”为核心#xff0c;按顺序执行操作。例如操作文件需依次调用 open→read/write→close#xff0c;开发者需关注每一步的实现细节。面向对象 面向对象、构造函数、初始化列表、引用、string一、面向过程与面向对象对比1. 核心思想差异面向过程以“步骤”为核心按顺序执行操作。例如操作文件需依次调用open→read/write→close开发者需关注每一步的实现细节。面向对象以“对象”为核心对象包含属性数据和方法操作。操作文件时文件作为对象自带打开/读写/关闭方法开发者只需调用对象的方法无需关注内部实现。2. 代码示例对比以 LCD 操作为例面向对象风格简洁高效无需关注初始化细节MyLcd l;// 创建 LCD 对象自动完成初始化l.DrawRectangle(200,100);// 调用对象方法画矩形l.DrawCircle(300,700,300);// 调用对象方法画圆l.LcdClose();// 调用对象方法关闭设备3. 优缺点总结面向对象开发效率高、代码易维护但对象创建有轻微性能开销。面向过程执行效率略高但代码复用性差、复杂项目维护难度大。二、构造函数Constructor1. 核心作用对象实例化时自动调用用于初始化对象的成员变量解决“对象使用前必须初始化”的问题如 LCD 设备需先打开才能使用。2. 语法规则无返回值连void都不能写函数名与类名完全一致。支持重载可定义多个参数不同的构造函数。若未手动定义编译器会自动生成一个“无参、无功能”的默认构造函数。一旦手动定义任意构造函数编译器不再自动生成默认构造函数。3. 常见用法#includeiostream#includecstringusingnamespacestd;classPerson{private:intage;charname[32];public:// 1. 无参构造默认构造Person(){age0;name[0]\0;// 字符串初始化避免垃圾值}// 2. 单参构造int 类型Person(inta){agea;name[0]\0;}// 3. 单参构造字符串类型Person(constchar*n){age0;strncpy(name,n,sizeof(name)-1);// 安全拷贝避免数组越界name[sizeof(name)-1]\0;}// 4. 多参构造Person(inta,constchar*n){agea;strncpy(name,n,sizeof(name)-1);name[sizeof(name)-1]\0;}// 5. 带默认参数的构造函数Person(inta18,constchar*nunknown){agea;strncpy(name,n,sizeof(name)-1);name[sizeof(name)-1]\0;}};4. 对象实例化与构造函数调用推荐使用{}初始化C11 新标准避免歧义Person p1;// 调用无参构造Person p2{18};// 调用单参构造intPerson p3{penglei};// 调用单参构造字符串Person p4{20,ZhangSan};// 调用多参构造Person p5{22,LiSi};// 调用带默认参数的构造覆盖默认值注意Person p();会被编译器识别为“函数声明”而非对象实例化需避免。5. 访问权限构造函数通常设为public允许外部实例化对象。特殊场景设为private如单例模式限制对象创建数量。6. 练习People 类设计classPeople{private:intage;string name;// 后续改用 string 类更安全便捷string addr;public:// 无参构造People():age(0),name(unknown),addr(unknown){}// 全参构造People(inta,conststringn,conststringad):age(a),name(n),addr(ad){}// 打印信息voidShowInfo(){coutAge: age, Name: name, Addr: addrendl;}};// 调用示例intmain(){People p1;p1.ShowInfo();// 输出Age: 0, Name: unknown, Addr: unknownPeople p2{25,WangWu,Beijing};p2.ShowInfo();// 输出Age: 25, Name: WangWu, Addr: Beijingreturn0;}三、析构函数Destructor1. 核心作用对象生命周期结束时自动调用用于清理资源如关闭文件、释放动态内存、解绑设备等避免资源泄漏。2. 语法规则无返回值无参数因此无法重载一个类只能有一个析构函数。函数名前加~与类名一致。若未手动定义编译器会自动生成一个“无功能”的默认析构函数。3. 用法示例classMyLcd{private:intfd-1;// 文件描述符unsignedint*plcdnullptr;// 内存映射指针public:// 构造函数打开 LCD 设备MyLcd(){fdopen(/dev/fb0,O_RDWR);if(fd-1){cerrLCD open failed!endl;return;}// 内存映射等初始化操作...coutLCD initialized!endl;}// 析构函数关闭设备、释放资源~MyLcd(){if(plcd!nullptr){munmap(plcd,800*480*4);// 释放内存映射plcdnullptr;}if(fd!-1){close(fd);// 关闭文件fd-1;}coutLCD resource released!endl;}};4. 调用顺序遵循“先构造后析构”原则先创建的对象最后被销毁后创建的对象先被销毁。示例intmain(){MyLcd l1;// 构造 l1MyLcd l2;// 构造 l2// 生命周期结束时先析构 l2再析构 l1return0;}// 输出// LCD initialized!// LCD initialized!// LCD resource released!// LCD resource released!5. 注意事项析构函数仅用于“清理资源”不建议写入业务逻辑。避免在构造函数/析构函数中使用return可能导致初始化/清理不完整。四、构造函数初始化列表1. 核心用途解决“构造函数体内无法初始化某些成员”的问题例如常量成员const修饰必须初始化且不可修改。引用成员必须在定义时初始化。父类无默认构造函数时需通过初始化列表传递参数。效率更高直接初始化成员变量而非先默认构造再赋值。2. 语法规则类名(参数列表):成员变量1(初始值1),成员变量2(初始值2),...{// 构造函数体可选用于后续逻辑处理}初始值可来自构造函数参数、常量或表达式。成员变量初始化顺序与“声明顺序”一致与初始化列表中的顺序无关。3. 用法示例classStudent{private:constintid;// 常量成员必须初始化intscoreRef;// 引用成员必须初始化string name;public:// 初始化列表初始化常量、引用、普通成员Student(intstudentId,intscore,conststringstudentName):id(studentId),scoreRef(score),name(studentName){// 构造函数体可省略无额外逻辑时}voidShow(){coutID: id, Name: name, Score: scoreRefendl;}};// 调用示例intmain(){intmathScore95;Student stu{1001,mathScore,ZhaoLiu};stu.Show();// 输出ID: 1001, Name: ZhaoLiu, Score: 95mathScore98;// 修改被引用的变量stu.Show();// 输出ID: 1001, Name: ZhaoLiu, Score: 98引用同步变化return0;}4. 注意事项若成员变量是数组如char name[32]初始化列表无法直接赋值需在构造函数体内用strcpy等函数处理。推荐优先使用初始化列表初始化成员变量尤其是常量、引用和自定义类型成员。五、引用Reference1. 核心概念引用是变量的“别名”与原变量指向同一块内存空间操作引用等价于操作原变量。用于替代指针解决指针的野指针、空指针等安全问题。2. 语法规则定义格式类型 引用名 原变量;必须在定义时初始化。引用类型必须与原变量类型一致或存在赋值兼容如子类引用指向父类对象。定义后引用不能重新绑定到其他变量。3. 基础用法inta1024;intba;// b 是 a 的别名与 a 共享内存b2048;// 修改 b 等价于修改 acoutaendl;// 输出2048couta bendl;// 地址相同4. 核心用途1函数参数传递替代指针更安全// 引用版 swap 函数无需解引用简洁安全voidswap(inta,intb){inttempa;ab;btemp;}// 调用示例intmain(){intx10,y20;swap(x,y);// 直接传变量无需传地址coutx yendl;// 输出20 10return0;}2函数返回值避免拷贝提升效率注意禁止返回局部变量的引用局部变量生命周期结束后释放引用会变成“悬空引用”。允许返回静态变量、全局变量、类成员变量、传入的引用参数。// 正确示例返回静态变量的引用intgetStaticValue(){staticintval0;// 静态变量生命周期与程序一致val;returnval;}// 正确示例返回传入的引用参数stringappendStr(strings,conststringsuffix){ssuffix;returns;}// 调用示例intmain(){coutgetStaticValue()endl;// 输出1coutgetStaticValue()endl;// 输出2string strHello;appendStr(str, World);coutstrendl;// 输出Hello Worldreturn0;}5. 引用与指针的区别必须掌握特性引用指针初始化定义时必须初始化可定义时不初始化野指针风险空值无空引用更安全有空指针nullptr重新绑定一旦绑定无法修改可随时改变指向的变量内存开销不占用额外内存仅别名占用内存存储变量地址多级使用无多级引用int a是右值引用非多级有多级指针int** p安全性高无野指针、无需解引用低需手动管理避免野指针传参/返回值简洁直观无需解引用需用*解引用取地址六、string 类字符串处理1. 核心优势替代 C 语言的char*字符串解决数组越界、手动管理内存等问题提供丰富的字符串操作接口安全且便捷。2. 头文件#includestring// 注意不是 string.hC 语言头文件usingnamespacestd;// 或 using std::string;3. 构造函数常用// 1. 无参构造空字符串string s1;// 2. 用字符构造n 个 chstrings2(5,a);// s2 aaaaa// 3. 用 C 风格字符串构造strings3(hello);// s3 hello// 4. 用 C 风格字符串的前 n 个字符构造strings4(hello world,5);// s4 hello// 5. 用初始化列表构造string s5{h,e,l,l,o};// s5 hello// 6. 拷贝构造用其他 string 对象构造strings6(s3);// s6 hellostring s7s3;// 等价于 s64. 赋值操作operatorstring s;sA;// 赋值单个字符shello;// 赋值 C 风格字符串string s2world;ss2;// 赋值 string 对象s!;// 追加字符串operator 重载5. 字符串拼接operatorstring s1Hello;string s2World;string s3s1 s2;// s3 Hello World6. 字符串比较重载运算符支持、!、、、、按字典序比较string aapple;string bbanana;cout(ab)endl;// 输出1trueapple 字典序小于 bananacout(aapple)endl;// 输出1true7. 字符串访问常用接口string sabcdefg;// 1. operator[]无越界检查效率高charc1s[2];// c1 cs[3]X;// s abcefg → 修正s 变为 abcXefg// 2. at()有越界检查越界抛异常安全charc2s.at(4);// c2 etry{s.at(10);// 越界抛 std::out_of_range 异常}catch(constexceptione){cerre.what()endl;}// 3. front() / back()获取首/尾字符charfirsts.front();// acharlasts.back();// g// 4. data() / c_str()返回 C 风格字符串const char*constchar*cStrs.c_str();// 用于兼容 C 语言接口如 open、printfprintf(%s\n,cStr);// 输出abcXefg8. 容量与大小常用接口string shello;couts.size()endl;// 输出5字符个数couts.length()endl;// 输出5与 size() 等价couts.empty()endl;// 输出0false非空couts.max_size()endl;// 输出字符串最大可容纳的字符数系统相关s.clear();// 清空字符串size() 变为 0couts.empty()endl;// 输出1true9. 字符串操作常用接口string shello;// 1. 追加s.push_back(!);// 尾部追加字符 → hello!s world;// 尾部追加字符串 → hello! world// 2. 插入s.insert(5,,);// 在索引 5 处插入字符 → hello,! world// 3. 删除s.erase(5,1);// 从索引 5 开始删除 1 个字符 → hello! world// 4. 查找size_t poss.find(world);// 查找子串返回起始索引6if(pos!string::npos){// 找到返回索引未找到返回 string::nposcoutFound at: posendl;}// 5. 替换s.replace(6,5,C);// 从索引 6 开始替换 5 个字符 → hello! C// 6. 截取子串string subs.substr(6,3);// 从索引 6 开始截取 3 个字符 → C10. 兼容 C 语言接口当需要调用 C 语言函数如open、fopen时用c_str()转换为const char*string path/mnt/share/test.txt;// 调用 C 语言 open 函数intfdopen(path.c_str(),O_RDWR);if(fd-1){perror(open failed);}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询