C++ primer Plus

C++primer Plus
1、数值类型
0、C语言编程:结构化编程,自上而下;C++:自下而上,继承,多态
1、c++数值转换问题。大浮点->小浮点;浮点->整型;大整型->小整形
2.、大括号的初始化称为列表初始化,多用于复杂的数据类型提供值列表,初始化不允许缩窄;在不同的整型之间转换或将整型转换为浮点型可允许 。
3、有符号整型按级别从高到低为long long、long、int、short、signed char;无符号整型和有符号整型的排列顺序相同;char、signed char、unsigned char类型级别相同;bool型级别最低;wchart_t、char16_t、char_32_t级别与其底层级别相同
4、传递参数时一般由C++原型控制;当取消原型控制时,C++将char和short整型提升;将float提升为double
5、强制类型转换:c语言格式:(type)name;C++格式:type(name);就像是函数调用;static_cast<>比传统轻质类型准换更合格
6、C++没有提供自动防止超出整型限制的功能,可以通过头文件climits来限定

2、复合类型
1、声明数组的通用格式:typename arrayname[arraysize];
2、sizeof和strlen的区别:sizeof是C语言的一个单目运算符,求数据类型所占空间的大小;而strlen是一个函数,用来计算字符串长度。总结:sizeof运算符指出整个数组的长度,strlen返回存储在数组中的字符串的长度。
3、初始化时让编译器计算元素个数的方法:

short things[]={1,2,3,4};int num_elements=sizeof(things)/sizeof(short);
4、STL增加了模板类vector,C++11增加了模板类array
5、面向行的输入方法:get()和getline();到达换行符时,getline将丢弃换行符;get将保留换行符。cin.getline;getline简单,get检查错误好
6、在混合输入字符串和数字时。注意:使用没有参数的get()  cin.get();或使用接受一个char参数的get()  (cin>>a).get()
7、string类可以声明为简单变量,而不是数组;能自动处理大小;strcpy()将字符串复制到字符数组中,strcat()将字符串附加到字符数组末尾;更安全也更复杂的函数,strncat,strncpy.
8、wchar_t,char16_t,char32_t.使用前缀L,u,U表示。原始(raw)字符串中字符代表自己。可与前三者结合使用
9、结构体初始化可使用列表初始化
10、结构化数组可以用初始化数组的方式来进行初始化:花括号,逗号
11、 结构中的位字段:通常用于低级编程中
12、共用体(uinion):能存储不同的数据类型。但只能同时存储其中的一种类型。在不同时间存储不同的变量;匿名共用体;共用体用来节省内存
13、枚举(enum):被用来定义符号常量
14、 一定要在指针解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址
15、C语言中,用库函数malloc分配内存,C++中使用new。通用格式为:1、typename *pointer_name=new typename;2、int higgens;int pt=&higgnes
16、使用delete释放内存:int *ps=new int;delete ps;  delete和new必须配对使用,防止出现内存泄漏
17、数组创建如果使用声明来创建,占用了内存,在编译时分配给数组内存称为静态联编(static binding),必须事先指定数组长度;若使用new创建,则在运行时需要才创建,还可以在运行时选择数组的长度,称为动态联编(dynamic binding)
例子:int */pos=new int[10];delete[ ] pos;type_name *pointer_name=new typename[elements_num]
对空指针delete是安全的;pointer_name指向第一个元素
18、可以把指针当做数组名使用,如pso[0];数组名和指针真正地差别是,数组名不可修改,但指针是变量可以修改,如p3=p3+1
19、指针和数组基本等价的原因在于指针算术。C++将数组名解释为地址
20、对数组使用sizeof得到的是数组的长度,对指针使用sizeof得到的是指针的长度,在这种情形下,C++不会将数组名解释为地址
21、数组名被解释为其第一个元素的地址,而对数组名应用地址运算符时,得到整个数组的地址。
例子:&tell是包含20个元素的short数组(short(*)[20])
可通过以下方式进行声明和初始化,short(*pas)[20]=&tell
22、给指针赋值:应将内存地址赋给指针,可以对变量名应用&运算符,来获得被命名的内存的地址。new运算符返回未命名的内存的地址
23、对指针解除引用:对指针解除引用意味着获得指针指向的值。对指针应用解除引用或间接运算符(*)来解除引用
另一种解除引用的方法是使用数组表示法。pn[0]与*pn等价
24、注意区分指针和指针所指向的值:pt为指向int的指针,则*pt为一个int变量
25、通常情况下,C++将数组名视为数组的第一个元素的地址;一种例外情况,当sizeof运算符用于数组名时,此时将返回整个数组的长度.
26、C++允许将指针和整数相加,加1的结果等于原来的地址值加上指向的对象占用的总字节数。将一个指针减去另一个指针,获得两个指针的差,后一种运算将得到一个整数,且当两个指针指向同一个数组时,才有意义。 
27、数组的动态联编和静态联编。静态联编是数组的长度在编译时设置;使用new[]运算符创建数组时,将采用动态联编,即在运行时分配空间。用完后要用delete释放占用的内存。
28、数组表示法和指针表示法:使用方括号数组表示法等同于对指针解除引用
29、因为C++不能保证字符串字面值被唯一的地 存储,当指针声明为const,编译器将禁止改变指针指向的位置
30、在将字符串读入程序时,应使用已经分配的内存地址,该地址可以是数组名,也可以是new 初始化的指针
31、cout打印指针将打印地址,指针类型为char*,cout将显示指向的字符串。要显示指向字符串的地址, 必须将指针转化为另一种指针类型如(int*)ps
指针的赋值只是复制地址,使两个指针指向相同的内存单元和字符串。
32、要获得字符串副本,首先要分配内存来存储字符串,通过声明数组或使用new,然后将字符串复制到新分配的空间中,使用strcpy()函数,两个参数()包括目标地址和字符串地址。但当目标数组比字符串数组小时,可使用strncpy函数,第3个参数是要复制的最大字符数,且最后需加上0字符
总结:必须使用strcpy()或strncpy()函数,,而不是赋值运算符来将字符串赋给数组。
33、上述是C风格的字符串,而C++String类型很简单:不用担心字符串越界,并可以使用赋值运算符。
34、用new创建动态结构不能将成员运算符句点用于结构名,因为只有名称,不知地址。可以使用箭头成员运算符,可用于指向结构的指针。
总结:1、当结构标识名是结构名,则使用句点运算符;如果标识符是指向结构的指针,则使用箭头运算符。
          2、另一种方法是,如果ps是指向结构的指针,则*ps就是被指向的值-结构本身。可使用(*ps).price。必须使用括号。

3、循环和关系表达式
35、C风格使用strcmp来比较字符串是否相等,C++可是使用String类的字符串直接比较。
36、C++为类型建立别名的方式有:1)使用预处理器 #define BYTE char 2)使用关键字typedef来创建别名,typedef char byte(typedef typename aliasname)
37、C++11新增了一种循环:基于范围的for循环。简化了数组或容器类的每个元素执行相同的操作
38、循环和文本输入:1)使用原始的cin输入2)使用cin.get(char)输入
注意:cin.get( )指的是不接受任何参数的版本;cin.get(char)指的是接受另一个参数的版本
39、结束输入CTRL+Z,继续输入cin.clrear
40、常见的字符输入做法:while(!cin.fail()==false)   while(!cin.fail( ) )  while(cin)  while(cin.get(ch))
41、可以使用cout.put(char)来显示字符
42、cin.get( )  cin.get(ch)
43、二维 数组,可以使用字符串指针数组、char数组和string对象数组 
44、条件运算符为了防止错误选择value==variable
45、取值范围测试用and来组合两个表达式;与运算符的优先级高于或运算符
46、cctype函数,可用isalpha()检查字符是否为字母字符,isdigits()检查字符是否为数字字符,isspace()测试字符是否为空白,ispunct()测试是否为标点符号。使用时需要在头文件设置为<cctype>
4、函数
47、cctype函数,可用isalpha()检查字符是否为字母字符,isdigits()检查字符是否为数字字符,isspace()测试字符是否为空白,ispunct()测试是否为标点符号。使用时需要在头文件设置为<cctype>
48、原型描述了函数编译器的接口,将函数返回值的类型以及参数的类型和数量告诉编译器。即它可以确保编译器正确处理函数返回值;检查使用的参数数目是否正确,检查参数类型是否正确。仅当有意义时,原型参数才导致类型转换。编译阶段进行的原型化成为静态类型检查(static type checking)
49、用于接受传递值的变量被称为形参,传递给函数的值成为实参。
50、C++     将数组名视为指针。C++将数组名解释为第一个元素的地址。当且仅当用于函数头或函数原型中,int sum_arr(int* arr,int n)与int sum_arr(int arr[],int n)等价,意味着arr为一个int指针。当指针指向数组第一个元素时,使用数组表示法;当指针指向一个独立的值时,使用指针表示法
51、arr[i]==*(ar+i);&arr[i]==ar+i; 
52、为了保护数组,可用const。如 void show_array(const double ar[ ],int n)
53、将const关键字指向指针,第一种是让指针指向一个常量对象,防止修改所指向的值;第二种是将指针本身声明为常量,防止改变指针指向的位置。
54、c++禁止将const指针的地址赋给非const指针
55、如果数据类型本身不是指针,可以将const数据或非const数据的地址赋给指向const的指针,但只能将非const数据的地址赋给非const指针。
56、 const  int * p; (推荐) p是一个指针,它指向的内容是const  int  类型。p本身不用初始化它可以指向任何标示符,但它指向的内容是不能被改变的
int * const p=一个地址; (因为指针本身的值是不能被修改的所以它必须被初始化), p是一个指针,这个指针是指向 int  的const指针。它指向的值是可以被改变的如*p=3;
57、结构编程时时,可以按值传递结构(结构较小时)和按地址传递结构,以及按引用传递结构
58、按地址传递结构:注意首先在调用函数时,将结构地址(&)而不是结构本身传递;将形参声明为指针*;由于形参是指针不是结构,使用间接成员符(->)而不是成员运算符(.);返回也是返回一个指针
59、使用array对象与结构时,注意要显示某个对象时,可以按值传递,要修改某个对象时,可以按地址传递,其实还可以按引用传递。模板array除了存储基本数据类型,还可以存储类对象。
如:
void show(std::array<double,4> da);void fill(std::array<double,4>*pa);
60、函数指针:使用函数名能获取函数地址。必须区分函数名和函数地址;声明指向函数的指针,必须指定指针指向的函数类型,即函数的返回类型以及函数的参数列表;即应该像函数原型那样指定有关函数的信息。

double pam(int);  double (*pf) (int)
一般要声明指向特定类型的函数指针,首先编写函数原型,然后用(*pf)替代函数名,则pf为指针。
61、括号很重要,优先级顺序,*pf(int)意味着pf()是一个返回指针的函数,而(*pf)(int)则意味着pf是一个指向函数的指针。

double pam(int);double (*pf)(int);pf=pam;
注意,传递地址时使用函数名即可。使用函数指针调用被指向的函数。在使用(*pf)时,将其看作函数名即可。
C++综合两种学派认为,pf与(*pf)等价
62、自动类型推断只能用于单值初始化,不可初始化列表。
63、pa是数组第一个元素的地址,单个指针的地址,&pa是整个数组的地址。要得到第一个元素的值,只需对pa解除一次引用,对&pa解除两次引用。

**&pa==*pa==pa[0]

64、使用函数的3个步骤是:定义函数、提供原型、调用函数
65、对类型为基本类型的函数参数不需要使用const限定符,因为程序传递基本类型时,将按值传递,以便函数使用副本,保护了原始数据。而const用于限定指针,防止指针指向的原始数据被破坏。
66、C风格字符串格式:char数组,双引号的字符串,用指向字符串第一个字符指针来表示。
67、按值传递:传递结构名即可,自动保护原始数据,以时间和内存为代价,可以使用结构成员表示法;按地址传递:使用地址运算符&,可节省时间和内存,但不能保护原始数据,除非对函数参数使用了const限定符,传递指针必须使用间接成员运算符。
68、
int judge(int (*pf)const char*))
69、inline是C++新增的特性,C语言使用预处理语句#define来定义宏-内联代码的原始实现。宏是通过文本替换实现的,不能按值传递。因此如果C语言的宏执行了类似函数的功能,应考虑将其转为内联函数
70、引用是已定义的变量的别名。主要用途是可以用作函数的形参,函数将使用原始数据,不需要使用副本。
71、创建引用变量:指向int变量的引用
int rats;
int & rodents=rats;
72、引用在声明时,必须将其初始化,而指针可以先声明再赋值

int & rodents=rats;
int* const rodents=&ratsl
73、按引用调用,允许被调用函数使用调用程序中的变量。

void swaper(int &a,int &b);按引用传递。
void swaper(int *a,int* b);按指针传递。
void swaper(int a,int b);按值传递
指针版本需要函数在使用形参时使用*解除引用运算符 。
结构体可通过传递地址进行。定义引用变量要将其初始化,函数使用实参初始化形参。
74、当使用基本类型参数时,应采用按值传递;当数据比较大时,可采用引用参数。
75、按值传递传参类型较多,按地址传递,按引用传递,限制严格。如果实参与引用参数不匹配,C++将产生临时变量,仅当参数为const引用时。
a)实参类型正确,但不是左值。b)实参类型不正确,但可以转换为正确的类型
左值是可被引用的数据对象,例如变量、数组元素、结构成员、引用和解除的指针;非左值包括字面常量和包含多项表达式
76、如果接受引用参数的函数的意图是修改作为参数传递的变量,则创建临时变量将组织这种意图的实现。解决办法就是禁止创建临时变量。
77、对于形参为const引用的函数,如实参不匹配,则类似于按值传递,即使用临时变量
78、将引用参数声明为常量数据的引用:
a)使用const可避免无意中修改数据的编程错误
b)使用const使函数能处理const和非const实参,
c)使用const引用使函数正确生成并使用临时变量。
79、C++11新增了一种引用:右值引用&&。现在的引用为左值引用
80、函数返回时避免返回函数终止时不再存在的内存单元引用。解决方法:返回一个作为参数传递给函数的引用;使用一个new来分配新的存储空间
81、将const作为引用返回类型,可以使用引用返回值,不允许赋值之类的。Primer plus Page268
82、当使用传递的值不做修改的函数,如果数据对象很小,按值传递;对象是数组,只能使用指针,且需要声明const指针;如对象结构较大,使用const指针或引用;如果数据对象是类对象,使用const引用,按引用传递。
83、对于修改函数中数据函数:若数据对象是内置数据类型,则使用指针;若对象是数组,只能使用指针;若对象是结构,则使用引用或指针;若对象是类对象,则使用引用。
84、设置默认参数:将值赋给原型中的参数;同时,对于带参列表的函数,必须从右向左添加默认值,当实参从左到右赋给相应形参时,不能跳过任何参数。通过设置默认参数:可以减少要定义的析构函数、方法以及方法重载的数量。
85、函数的多态就意味着函数重载。函数的参数列表(函数特征标)使得函数可以进行重载。编译器将类型引用和类型本身视为同一个特征标。
86、重载引用参数调用最匹配的版本
87、仅当函数基本执行相同任务,但使用不同形式数据,才使用函数重载。
88、函数模板:使用泛型定义函数
template<typename AnyType>
void Swap<AnyType &a,AnyType &b)
{
     AnyType temp;
     temp=a;
     a=b;
     b=temp;
}
注意:如果将同一个算法用于不同类型的函数,可以使用模板。若不考虑向后兼容的问题,并愿意键入较长的单词,则使用typename而不是class.
89、重载模板:被重载的模板的函数特征标必须不同
90、显示具体化优先于常规模板,而非模板优先于具体化和常规模板。

void Swap(job &a,job &b);

template<typename T>
void Swap(T &,T &);

template<> void Swap<job>(job &,job &);

91、函数的显示具体化

template <> void Swap<int>(int &,int &);
template <> void Swap(int &,int &);
函数的显示实例化:

template void Swap<int>(int,int);
显示实例化和具体化的区别:显示具体化声明再关键字template后包含<>,而显示实例化没有。两者只能选一种。可以通过前缀template<>和template来区分显示实例化和显示具体化
92、对于函数重载、函数模板、函数模板重载。通过函数重载解析来选择。1、创建候选函数列表2、使用候选函数列表创建可行函数列表3、确定是否有最佳的可行函数。从最佳到最差的顺序为:完全匹配、提升转换、标准转换、用户定义的转换
93、整数类型不能被隐式地转换(即没有显式强制类型转换)为指针类型
94、指向非const数据的指针和引用优先于非const指针和引用参数匹配;非模板函数(包括显式具体化)优先于模板函数;两个模板函数,较具体的模板函数更优先。即显式具体化将优于模板隐式生成的具体化
95、decltype进行类型推导, 主要是为泛型编程而设计,以解决泛型编程中,由于有些类型由模板参数决定,而难以(甚至不可能)表示之的问题。;还有后置类型。auto h(int x,float y)->double
96、只有一行代码的小型,非递归函数适合定义为内联函数
97、函数默认值必须从右向左提供,因此不能随便赋予默认值
98、注意:函数具体化必须现有函数模板
99、 由于 C++ 标准库中的 I/O 类对 << 操作符重载,因此在遇到字符型指针的时候会将其作为字符串名进行处理,输出指针所指的字符串。既然如此,我们就别让它知道那是字符串指针,所以,需要用到强制类型转换,把字符串指针转换成无类型的指针。
只要别让编译器认为那是一个指向字符串的指针,那么就可以输出地址,而不是字符串的内容
     cout<<(void *)c<<endl;
5、内存模型和名称空间
100、头文件包括:函数原型、使用#define和const定义的符号常量、结构声明、类声明、模板声明、内联函数
101、#ifndef可以避免多次包含同一个头文件
102、C++使用三种不同的方案来存储数据:自动存储持续性(在函数定义中声明的变量)、静态存储持续性(static)、线程存储持续性(thread_local)、动态存储持续性(new,但需要delete将其释放,有时被称为自由存储(free store)或堆(heap))。
103、作用域描述了名称在文件(翻译单元中)的多大范围可见。链接性(linkage)描述了名称在不同单元间共享,链接性为外部可在文件间共享,为内部则只能由一个文件函数共享。自动变量无链接性,不可共享。
104、自动变量只在包含它们的函数或代码块中可见,auto关键字用于默认自动的变量,即为局部自动变量。
105、栈“后进先出”,register寄存器变量,显式地指出变量是自动的
106、静态变量:链接性为外部的静态持续变量,必须在代码块的外面进行声明;链接性为内部的静态持续变量,必须在代码块外部声明,并使用static限定符;创建没有链接性的静态持续变量,在代码块内声明,并使用static限定符,
107、未被初始化的静态成员变量的所有位都被设置为0,即为0初始化的。
108、静态变量进行常量表达式初始化和动态初始化
109、C++变量声明:一种是定义声明,给变量分配存储空间;另一种是引用声明,不分配空间。

double up;//定义
extern int blem;//声明
110、作用域解析符::,将其放在变量名前面时,该运算符使用全局版本
111、说明符:auto、register、static、extern、therad_local、mutuable
cv-限定符:const、volatile
使用new和new[]分别调用以下函数  分配函数
void* operator new(str::size_t);
void* operator new[](str::size_t);
void operator delete(void*);
void operator delete[](void*);
112、new负责在堆(heap)中找到一个足以能满足要求的内存块,还有定位new运算符:返回传递给它的地址,并将其强制转换为void *,以便能赋给任何指针类型。
int *pi=new int;
int *p2=new(buffer)int;//调用了new(sizeof(int),buffer)
int *p3=new(buffer)int [40]//调用了new(40*sizeof(int),buffer)
113、using声明:将特定的名称添加到所属的声明区域中和using编译指令:使名称空间的所有名称可用,不需要使用作用域解析运算符
using Jill::fetch;
using namespace std;
6、对象和类
114、OOP特性:抽象、封装和数据隐藏、多态、继承、代码的可重用性。
制定基本类型完成了三项工作:决定出具对象需要的内存数量、决定如何解释内存中的位、决定可使用数据对象执行的操作或方法
115、类规范由两个部分组成:类声明和类方法定义。类声明:以数据成员的方式描述数据部分,以成员函数(方法)的方式描述公有接口;类方法定义:描述如何实现类成员函数。
116、类设计尽可能将公有接口与实现细节分开。公有接口表示设计的抽象组件。将实现细节放在一起并将它们与抽象分开成为封装。数据隐藏(将数据放在类的私有部分中)是一种封装,将实现的细节隐藏在私有部分;另一种封装:将类函数和类声明放在不同文件中。
117、一般来说,数据项通常放在私有部分,组成类接口的成员函数放在公有部分。不能直接调用私有函数,弹弓有函数可以使用它们。
118、结构和类的区别:结构的默认访问对象是public,而类为private。一般使用类实现类描述,把结构限制为纯粹的数据对象
119、定义成员函数时,使用作用域解析运算符(::)来标识函数所属的类;类方法可以访问类的private组件。
120、一般将内联定义放在定义类的头文件中,在OOP中,调用成员函数被称为发送消息,将同样的消息发送给两个不同的对象将调用同一个方法,但该方法将被用于两个不同的对象。
121、客户/服务器模型,即client-server model。在oop中,client是使用类的程序,类声明(包括类方法)构成了服务器。因此client了解该接口,sever确保服务器根据该接口可靠并准确地 执行。sever设计人员只能修改类设计的实现细节,而不能改接口。
122、setf可以避免科学计数法,可控制格式。
std::ios_base::fmtflags orig=std::cout.setf(std::ios_base::fixed,ios_base::floafied);

cout.setf(orig,ios_base::floatfied);
123、构造函数和析构函数。构造函数没有声明原型类型,进行初始化。程序声明对象时,将自动调用构造函数。构造函数要注意成员名和参数名不可相同,可以在数据成员中使用m_前缀,或在成员名中使用后缀。
类构造函数
Stock gaement=Stock("Furry Mason",50,2.5));
Stock *pstock=new Stock("Furry Mason",50,2.5);

注意:无法使用对象来调用构造函数,因为在构造函数构造出对象之前,不存在对象。因此构造函数用于创建对象,而不能通过对象来调用。
124、定义默认构造函数的方式:1、给已有构造函数的所有参数提供默认值2、通过函数重载来定义另一个构造函数(没有参数的构造函数)
125、析构函数没有参数,~stoke(),当类对象过期时,析构函数将自动被调用。
126、代码块内执行完毕,才会调用析构函数。
127、const 成员函数,保证函数不会修改调用对象,将const关键字放在函数的括号后面。只要类方法不修改调用对象,就应当将其声明为conts。

void show() const
128、所有的类方法将this指针设置为调用它的对象的地址。指针可以访问结构成员,类成员。this指针指向电泳对象,如果方法需要引用整个调用对象,则可以使用表达式*this。若在函数括号后使用const限定符将this先定位const,这样不能用this修改对象的值。this是对象的地址,*this是对象

kate.topval(joe)
kate来调用topval(),s是joke,this指向kate,*this是kate
129、可使用构造函数来初始化数组元素,为每个元素调用构造函数。初始化对象数组:首先使用默认构造函数创建数组元素,用花括号中的构造函数创建临时对象,将临时对象的内容复制到相应的元素中。
130、在类中定义的名称的作用域为整个类。作用域为类的常量:第一种方式在类中声明一个枚举,在类中声明的枚举的作用域为整个类

class Bakery
{
     private:
           enum{months=12};
          double costs[months];
}
第二种方式是使用关键字static,将常量与其它静态变量存储在一起,而不是存储在对象中。

class Bakery
{
     private:
          static const int months=12;
          double costs[months];
}
131、作用域内枚举,使用时需要用枚举名来限定枚举量

enum class egg{small,medium,large,jumbo};
enum class t_shirt{small,medium,large,xlarge};
132、类适合于描述adt,公有成员函数接口提供了ADT描述的服务,类的私有部分和类方法的代码提供了实现,并对类的客户隐藏
133、类定义了一种数据类型,包括如何使用它。对象是一种变量或其他数据类型(如用new生成的),并根据类成员被创建和使用。类和对象之间的关系和标准变量和其变量。
134、如果创建给定类的多个对象,则每个对象都有自己的数据内存空间;但所有的对象都使用同一组成员函数(方法是公有的,数据是私有的)。
135、在创建类对象或显示调用构造函数时,类构造函数可被调用。当类对象过期,类析构函数将被调用。
136、默认构造函数的好处:拥有默认构造函数后,可以声明对象,而不初始化它,即使已定义了初始化构造函数。而且还能声明数组。默认参数在原因中
137、this是类方法可以使用的指针,指向于用于调用方法的对象,this是地址,*this是对象。
138、运算符函数格式:operator(argument-list)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值