C++
剑决浮云气
事了拂衣去,深藏功与名
展开
-
快速初始化成员变量和sizeof
1.快速初始化成员变量①在C++98的标准可以在类中使用 “=初始值” 的方式来对类中的成员进行初始化,但是是十分严格的,,如果静态成员不满足常量性,且成员不是整型或枚举类型,是无法初始化的非静态成员的初始化,在构造函数中进行②在c++11当中,可以使用= {} 来对非静态成员变量来进行初始化class Test{ int a = 10; double b{ 1.3 }; vector<int> c{ 1,2,3,4,5 }; };原创 2022-01-28 10:30:16 · 152 阅读 · 0 评论 -
noexcept修饰符和noexcept操作符
1. 弃用throw我们可能见过的异常处理 长这个样子void except_fun() throw(int, double) { }但是由于该特性很少被使用到,所以被弃用了表示函数不会抛出异常的throw() 也已经被新的关键字noexcept关键字代替2.noexcept表示其修饰的函数 不会抛出异常,在西皮皮11中,如果noexcept修饰的函数抛出了异常,那么编译器会调用std::terminate()直接终止运行了,从语法上面讲 有两种形式①void fun() noexce原创 2022-01-24 10:51:50 · 189 阅读 · 0 评论 -
如何在win32控制台下输出wchar_t数组中的中文
1.关键 locale loc("chs"); // 定义“区域设置”为中文方式 wcout.imbue(loc); // 载入中文字符输入方式2.一个例子int __cdecl main(void){ locale loc("chs"); // 定义“区域设置”为中文方式 wcout.imbue(loc); // 载入中文字符输入方式 WSADATA wsaData; if (0 != WSAStartup(MAKEWORD(2, 2), &w原创 2021-11-17 14:29:47 · 466 阅读 · 0 评论 -
在头文件中定义或声明变量
1.在头文件中定义const类型的非static变量,在link时不会报错,这是因为const型的变量在complie时已经转换为常量,每个obj模块里有一个相同内容的常量,并不会有变量名冲突发生。2.在头文件定义非const类型时,link时报错,这是因为这样相当于在每个包含该头文件的cc文件的全局域定义了一个名字相同的全局变量,虽然在complie时由于分开编译,不会产生错误,但是在link时,将会发生变量名冲突。3.在头文件中使用extern 声明一个全局变量时可以的,而且是全局变量使用的推荐做法原创 2021-07-07 21:15:45 · 5098 阅读 · 1 评论 -
C++ 编译器生成默认构造函数的四种情况
编译器什么时候 会生成默认构造函数C++ 编译器生成默认构造函数的四种情况c++新手的两个误解:1)任何类如果没有定义默认构造函数,就会被合成出来一个。2)编译器合成出来的默认构造函数会显式设定“类内每一个数据成员的默认值”。上述两种说法都是错误的!C++ 编译器生成默认构造函数的四种情况:1)类成员中有成员是类对象,并且该成员的类含有默认构造函数。那么C++编译器会给这个类也生成一个默认构造函数,用来调用其成员对象的构造函数,完成该成员的初始化构造。如果这个成员的类没有给出默认构造函数,那么原创 2021-06-03 15:50:26 · 516 阅读 · 2 评论 -
类模板成员函数
模板类的头文件#ifndef __POINTER_H__#define __POINTER_H__#include <iostream>using namespace std;template <typename T>class POINTER{ public: POINTER(T* pTemp) : pointer(pTemp){} T* operator++() { ++pointer; return pointer; } T原创 2021-06-03 11:25:34 · 808 阅读 · 0 评论 -
保护继承
使用保护继承的时候,基类的公有成员和保护成员会成为派生类的保护成员私有继承,基类的公有成员和保护成员都会成为派生类的私有成员在使用私有继承的时候,基类为1代,他的派生类为2代,派生类的派生类为3代。那么3代 就不能访问 1代的公有方法了,因为他成为了 2代的 私有成员一个例子Time.hTime1 Time2 Time3#ifndef __TIME_H__#define __TIME_H__class TIME1{private: int Year;protected:原创 2021-03-24 15:41:35 · 608 阅读 · 0 评论 -
私有继承
使用私有继承,那么基类的共有成员和保护成员都成了派生类的私有成员,基类的公有方法 将成为 派生类的私有方法一个私有继承的例子class STUDENT : private std::string, private std::valarray<double>{};一个Student类 私有继承了 string 和 valarray这个私有继承 提供了两个无名的子对象成员那么对于私有继承,我们如何用构造函数进行初始化呢?class STUDENT : private std:原创 2021-03-23 10:38:13 · 332 阅读 · 1 评论 -
虚函数的注意事项
关于基类中虚函数的重载如果基类中的声明被重载了,则应该在派生类中重新定义所有的基类版本基类HUMAN中 virtual void Show(void) const; virtual void Show(int nNum) const; virtual void Show(double dNum) const;派生类MAN中virtual void Show(void) const;那么派生类将会隐藏另外两个版本 A.Show(1); A.Show(2.5); A.Show();原创 2021-03-22 16:19:51 · 167 阅读 · 0 评论 -
虚函数
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”经常在基类中,将派生类重写基类的方法 定义为虚函数方法在基类中声明为虚函数之后,那么他会自动在派生类中声明这个方法,当然在派生类中显示声明,是一个更好的选择例子①基类 HUMANvirtual void Show(void) const;class HUMAN{private: int Age; int He原创 2021-03-22 10:50:50 · 235 阅读 · 1 评论 -
继承学习第一天 共有派生
如何共有派生一个类class MAN :public HUMAN基类 HUMANclass HUMAN{private: int Age; int Height; string Name;public: HUMAN(int age, int height, string & name);//构造函数 HUMAN(const HUMAN & Temp);//复制构造函数 ~HUMAN(void);//析构函数 void SetAge(const int age);原创 2021-03-21 16:57:20 · 390 阅读 · 1 评论 -
必须使用【初始化列表】初始化数据成员的情况
原文链接转载 2021-03-19 20:40:43 · 227 阅读 · 0 评论 -
复制构造函数
复制构造函数 是用来将一个对象复制到新创建的对象当中,是内容的拷贝,函数原型通常如下ClassName(const ClassName &);何时调用复制构造函数新建一个对象,并将其初始化为现有同类对象时,复制构造函数将会被调用每当程序生成了对象的副本时,都会显示调用复制构造函数代码此处并未写复制构造函数,他被注释起来了头文件声明#ifndef __STUDENT_H__#define __STUDENT_H__class STUDENT{ private: sta原创 2021-03-18 22:16:47 · 1250 阅读 · 5 评论 -
类中静态变量
不能在类声明中 初始化静态变量,这是因为声明描述了如何分配内存,但并未实际分配内存。对于静态类成员,无论这个类的对象有多少个,静态成员都只有一个对于静态类成员,可以在类声明之外使用单独的语句来进行初始化。因为静态类成员是单独存在的,不属于对象的组成部分例子static int nAmount;int STUDENT::nAmount = 10;#ifndef __STUDENT_H__#define __STUDENT_H__#include <iostream>clas原创 2021-03-06 10:59:05 · 2765 阅读 · 0 评论 -
转换函数
转换函数 是用来将 类类型 转化成 某种特定类型格式:operator typename();注意①转换函数必须是类方法②没有任何参数③不能指定返回类型例子operator int () const;operator double () const;#ifndef __TIME_H__#define __TIME_H__class TIME{ private: int nHours; int nMinutes; double Test; public: TIM原创 2021-03-05 16:44:32 · 457 阅读 · 0 评论 -
C++ 类的隐式转换之基本数据类型
类的定义与基本数据类型相关,基本数据类型与类相互转换接受一个参数的构造函数 为将该类型与该参数相同的值转化为类TIME(int H);#ifndef __TIME_H__#define __TIME_H__class TIME{ private: int nHours; int nMinutes; public: TIME(); TIME(int H, int M); TIME(int H); void SetTime(int H, int M); void S原创 2021-03-05 11:40:52 · 141 阅读 · 1 评论 -
如何创建友元函数
①将其原型放在类声明中,并在原型声明前加上关键字friend虽然是在类中声明的,但是他却不是成员函数,不能通过成员运算符来调用;虽然他不是成员函数,但是和成员函数的权限相同②编写函数定义,因为他不是成员函数,所以函数定义不能加 (类名:???? 限定符,在定义中也不需要用关键字friend例子friend TIME operator*(double b, const TIME & t);#ifndef __TIME_H__#define __TIME_H__class TIME{原创 2021-03-05 08:37:10 · 282 阅读 · 1 评论 -
友元函数
为何需要友元?在为类重载二元运算符时(带两个参数的运算符),常常需要友元例子该例子中重载了*运算符,需要一个double类型的参数#ifndef __TIME_H__#define __TIME_H__class TIME{ private: int nHours; int nMinutes; public: TIME(); TIME(int H, int M); void SetTime(int H, int M); void ShowTime(void) co原创 2021-03-05 08:25:44 · 161 阅读 · 1 评论 -
运算符的重载
形式 operatorop()例如operator+() 重载了+运算符op必须是有效的C++运算符代码一个时间类#ifndef __TIME_H__#define __TIME_H__class TIME{ private: int nHours; int nMinutes; public: TIME(); TIME(int H, int M); void SetTime(int H, int M); void ShowTime(void) const;原创 2021-03-04 16:47:33 · 79 阅读 · 1 评论 -
作用域内枚举
传统的枚举存在一些问题,其中之一是两个枚举类型定义中的枚举量可能发生冲突enum egg {Small, Medium, Large, Jumbo};enum t_shirt {Small, Medium, Large, Xlarge};这将无法通过编译(egg Small和t_shirt Small发生冲突)解决办法(新枚举): C++11提供了一种新枚举,其枚举量的作用域为类:enum class egg {Small, Medium, Large, Jumbo};eum class t_s原创 2021-03-04 12:35:55 · 291 阅读 · 2 评论 -
在类中定义常量
原文链接用下面的一个问题来说明。问题:在类中建立一个int类型的数组方法一:(错误)class Test{const int size = 100;int array[size];//……};错误原因:1:因为在一个类中,const恢复了它在c中的一部分意思,在每个类对象里分配存储并代表一个值,这个值一旦被初始化以后就不能被改变。所以在类中使用了const的意思是:在这个对象的生命周期内,它是一个常量。然而,每个对象可能包含不同的值。2:对const常量进行了初始化,C++中这个初转载 2021-03-04 12:26:34 · 400 阅读 · 1 评论 -
const 成员函数
标题类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。所以 const 关键字对成员函数的行为作了更加明确的限定:(1)有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是可读可写的。原创 2021-03-04 10:39:28 · 269 阅读 · 1 评论 -
析构函数
和类同名,没有参数~类名();~STUDENT();#ifndef __STUDENT_H__#define __STUDENT_H__class STUDENT{ private: int nID; int nAge; const char *pName; public: STUDENT(); STUDENT(int ID, int Age, const char *pStr); ~STUDENT(); char * GetName(void); int原创 2021-03-04 10:31:28 · 79 阅读 · 1 评论 -
学习类的第二天
构造函数构造函数,是当你定义一个类对象的时候,可以直接对其数据成员进行初始化,而不需要调用其成员函数进行赋值。构造函数的函数名和类名相同,但是没有返回值#ifndef __STUDENT_H__#define __STUDENT_H__class STUDENT{ private: int nID; int nAge; const char *pName; public: STUDENT(int ID, int Age, const char *pStr); char原创 2021-03-04 09:25:14 · 104 阅读 · 2 评论 -
学习类的第一天
头文件中类的声明#ifndef __STUDENT_H__#define __STUDENT_H__class STUDENT{ private: int nId; int nAge; void OutPut(void) { std::cout<<nId<<" "<<nAge<<std::endl; } public: void SetId(int nNum); int GetId();};#endif原创 2021-03-03 22:14:08 · 64 阅读 · 1 评论 -
using编译指令和using声明比较
using编译指令会导入一个名称空间中的所有名称,但是他与使用多个using声明是不同的,而更像是使用作用域解析运算符#include <iostream>using namespace std;namespace ZHU{ int nAge; int nId = 10; namespace HUA { double dHeight; };};int nId = 20;int main(int argc, char* argv[]){ using name原创 2021-03-03 20:48:53 · 193 阅读 · 3 评论 -
Namespace名称空间
名称空间是为了更好的控制名称的作用域一个名称空间的名称 不会与另外一个 名称空间的名称相冲突例子namespace Jack{double pail;void fetch();int pail;};namespace Mary{double bucket(double n) {…}double fetch;int pail;};名称空间可以是全局的,也可以放在另外一个名称空间中,但不允许放在代码块中namespace ZHU{ int nAge; int nId;原创 2021-03-03 11:39:48 · 118 阅读 · 0 评论 -
具体化和实例化的应用
具体化和实例化都是对函数模板来说的,都必须首先声明函数模板,否则会报错#include <iostream>#include <string>using namespace std;/*模板声明 必须包含*/template <typename T>void MySwap(T& a, T& b);struct NODE{ int ID; int nAge;};//一个对MySwap函数模板的具体化template <原创 2021-03-03 10:42:50 · 117 阅读 · 0 评论 -
模板的实例化和具体化
隐式实例化:后面有程序用了,编译器才会根据模板生成一个实例函数,显式实例化:是无论是否有程序用,编译器都会生成一个实例函数,显示具体化:因为对于某些特殊类型,可能不适合模板实现,需要重新定义实现,此时就是使用显示具体化的场景显示实例化话是模板的一个具体实例,因为模zhi板生成函数dao一般是隐式实例化的,根据实参的类型生成函数。而显示实例化直接指定生成模板的哪一种实例。显示具体化是指模板的特殊行为,理论上模板接受不同类型的参数都会按照模板定义的那样去执行,显示具体化允许在特定的形参下重新定义函数的行为原创 2021-03-03 09:18:40 · 425 阅读 · 1 评论 -
默认参数
默认参数是指函数调用时,没有提供实参,自动使用的一个值 1 #include <iostream> 2 using namespace std; 3 4 int a(int n = 1) 5 { 6 return n; 7 } 8 9 10 int main(void) 11 { 15 cout<<a()<<endl; 16 return 0; 17 }输出结果就是默认值1 如果提供实参,则实原创 2021-03-01 11:17:26 · 983 阅读 · 0 评论