1、复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中(包括按值传递参数),而不是常规的赋值过程中。 #include <iostream> class A { public: A(){ std::cout << "default" << std::endl; } }; int main(){ A a; A b(
随着项目的增大,名称相互冲突的可能性也将增加。使用多个厂商的类库时,可能导致名称冲突。例如,两个库可能都定义了名为List、Tree和Node的类,但定义的方式不兼容。用户可能希望使用一个库的List类,而使用另一个库的Tree类。这种冲突被称为名称空间问题。 1、使用关键字namespace创建命名空间 namespace Jack { double pail; void fetch();
对类型进行初始化时,语法是相当的多,为什么要这么多初始化方法呢?主要是以前各种类型的初始化方式不同,现在演变成如此多的方式就是为了使初始化常规变量的方式与初始化类变量的方式更像。大括号初始化器是后来扩展出的用于任何类型,所以尽量使用大括号初始化语法。 1、基本类型初始化 int math = 12; int math(12); int math{12}; int math = {12}; int
一个典型的函数定义包括:返回类型、函数名字、0个或多个参数以及函数体。 举例计算5的阶乘 int fact(int val){ int ret = 1; while(val>0){ ret *=val--; } return ret; }第一个int就是返回类型是int,fact是函数名,int val是参数,大括号中是函数体。 //调用 int j = fact(5);如
1、vector表示一段连续的内存区域,每个元素被顺序存储在这段内存中,对 vector的随机访问效率很高,因为每次访问离vector起始处的位移都是固定的。在任意位置,而不是末尾插入元素,则效率很低。删除其中一个元素,而不是最后一个元素效率同样很低,因为后面的元素需要往后拷贝一遍。 2、list表示非连续的内存,并通过一对指向收尾元素的指针双向连接起来,从而允许向前和向后两个方向进行
string version1(const string &s1,const string &s2){ string temp; temp = s2 + s1 + s2; return temp; } const string &version2(string &s1,const string &s2){ s1 = s2 + s1 + s
1、c类型的字符串和数组字符串 unsigned int c_in_str(const char *str,char ch){ unsigned int count = 0; while(*str){ if(*str == ch) count++; str++; } return count; } using namespace std; int main(){
int sum_arr(int arr[],int n) { int total = 0; for(int i=0;i<n;i++){ total = total + arr[i]; } return total; }方括号指出arr是一个数组,而方括号为空则表明,可以将任何长度的数组传递给该函数,n代表数组的长度。实际数组名就是指针,解释为其第一个元素的地址。 in
1、字符数组与字符串比较 char word[] = "hello"; word == "hello"; //这样比较是不行的数组名是数组的地址。同样,用引号括起的字符串常量也是其地址。因此,上面的关系表达式不是判断两个字符串是否相同,而是查看它们是否存储在相同的地址上。 应使用C-风格字符串库中的strcmp( ) 函数来比较。该函数接受两个字符串地址作为参数。这意味着参数可以是指针、字符串常
return 语句终止当前正在执行的函数并将控制权返回到调用该函数的地方。 函数返回有2种,一种没有返回值,一种有返回值。 没有返回值的return语句只能用在返回类型是void的函数中。返回void的函数不要求非有return语句,函数最后一句会隐式执行return。 void函数想在中间提前退出可以使用return语句。 有返回值的return语句返回的值要和函数返回类型相一致或可以转换。
C++的enum工具提供了另一种创建符号常量的方式,这种方式可以代替const。 enum spect {red,orange,yellow,green,blue};spect是枚举类型名,red,orange等的值是0到4。 //声明 spect band;//赋值,赋值的内容需要是枚举中定义的 band = orange;//枚举中的值可以当做数字。 int color = red;
函数模板是通用的函数描述,也就是说,它们使用泛型来定义函数,其中的泛型可用具体的类型(如int或double)替换。 例如如果定义一个2个数交换值的函数,如果2个数是int,那就需要定义一个Swap(int i,int j)的函数,那如果2个数是double类型的就需要再定义一个Swap(double i,double j)的函数,那还有其他类型的话还要继续定义,其实实现的方式都一样,只是类型不同
引用非常适合用于结构和类,使用结构引用参数的方式与使用基本变量引用相同,只需在声明结构参数时使用引用运算符&即可。 struct free_throws { string name; int mode; int attempts; float percent;}; void display(const free_throws &ft);void set_pc(free_
使用迭代器可以访问某个元素,也能从一个元素移动到另外一个元素。迭代器有begin和end成员,begin成员负责返回指向第一个元素,end成员负责返回指向容器尾元素下一个位置。 下面是把第一个字符改为大写 string s("hello world");if (s.begin() != s.end() ){ auto it = s.begin(); *it = toupper(*it); /
1、在模板函数中,通过对模板类型的运算后,并不能确定返回的类型。 template<class T1,class T2>void ft(T1 x,T2 y){ ? xpy = x+y;}x+y的返回值是无法确定的,可以使用decltype来实现。 decltype(x+y) xpy = x+y;decltype(x+y)的意思就是返回类型就是x+y的结果类型。 double x
需要多个对不同类型使用同一种算法的函数时,可使用模板。然而,并非所有的类型都使用相同的算法。为满足这 种需求,可以像重载常规函数定义那样重载模板定义。 template <typename T> void Swap(T &a,T &b); template <typename T>void Swap(T *a,T *b,int n) ;int main
函数重载指的是可以有多个同名的函数,因此对名称进行了重载。函数重载的关键是函数的参数列表,如果参数数目或参数类型不同,则特征标也不同。 void print(const char *str,int width);void print(const char *str);上面2个参数数目不同,所以是重载函数。 void print(int i,int width);这个与上面2个参数类型不同,所以
默认参数指的是当函数调用中省略了实参时自动使用的一个值。如何设置默认值呢?必须通过函数原型。 char * left(const char * str,int n = 1);left函数返回字符串指针,第二个参数n设置的默认值为0,如果调用时,没有传入此值,相当于传入的就是1,如果传入了值,就按照传入值当做参数。 实现left函数时,不需要带上默认值 char * left(const cha
引用经常被用作函数参数,使得函数中的变量名成为调用程序中的变量的别名。这种传递参数的方法称为按引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。 引用传递对应的是按值传递,先说按值传递 int add(int i,int j);int add(int i,int j) { return i+j;}int main(){ int x = 1; int y = 2; return
函数的地址是存储其机器语言代码的内存的开始地址。通常,这些地址对用户而言,既不重要,也没有什么用处,但对程序而言,却很有用。例如,可以编写将另一个函数的地址作为参数的函数。这样第一个函数将能够找到第二个函数,并运行它。与直接调用另一个函数相比,这种方法很笨拙,但它允许在不同的时间传递不同函数的地址,这意味着可以在不同的时间使用不同的函数。 #include <iostream>#i
当结构比较小时,按值传递结构最合理。 传递2个值结构体,返回一个结构体,返回的结构体中的成员是参数各成员的和。 #include <cstring>using namespace std;struct things { int good; int bad; };things sum(things th1,things th2);void show(things th);int
使用指针指向结构体,通过指针访问结构体的方式。 #include <iostream>#include <cstring>using namespace std;int main(){ struct things { int good; int bad; }; things grubnose = {3,453}; things *pt = &grubn
指针是一个变量,其存储的是值的地址,而不是值本身。如何找到常规变量的地址?只需对变量应用地址运算符(&),就可以获得它的位置; int donuts = 3; &donuts就是取donuts变量的地址。 指针名表示的是地址。*运算符被称为间接值或解除引用运算符,将其应用于指针,可以得到该地址处存储的值。 int updates = 4;int *p_updates = &
数组与vector比较相似,只是数组大小固定,不能随意增加。 数组定义和初始化,数组元素个数必须是常量表达式 int arr[10]; //代表此数组包含10个int元素constexpr unsigned sz = 10;int arr[sz];int arr2[3] = {0,1,2};字符数组比较特殊,可以使用字符串字面值进行初始化。 char a1[] = {'a','b','c'};
共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。也就是说,结构可以同时存储int、long和double,共用体只能存储int、long或double。 union one { int int_val; long long_val; double double_val;};one变量用来存储int,long或double,共同体每次只能存储一个值
结构体由关键字struct后面跟着结构体名字,大括号里面包含成员变量。 struct inf {char name[20];flaot volume;string bigname;}; //定义变量 inf hat; //也可以在定义struct的时候定义变量 struct inf {char name[20];flaot volume;string bigname;}smi,jone; //定义
标准库string表示可变长的字符序列,使用string类型不要包含string头文件 #include <string>using std::string;string对象的初始化string s1; //空字符串string s2 = s1; //s2是s1的副本string s3 = "abc"; //使用字符串string s3("abc");string s4(10,'c'
希望定义一种变量,他的值不能被改变,使用const限定符,定义const对象时必须初始化。 const int buf = 1024; const对象只在文件内有效。如果有多个文件需要访问某个const对象,需要在每个文件中都定义一次const对象,这样在多个文件中出现了同名的const变量。某些时候它的初始值不是一个常量表达式,但又必要在多个文件中共享,需要使用extern。 f.h exter
变量提供一个可供程序操作的存储空间。c++中的每个变量都有其数据类型,数据类型决定着变量所占内存空间的大小和布局方式。 变量定义的基本形式是:类型说明符,随后紧跟由一个或多个变量名组成的列表,其中变量名以逗号分隔,最后以分号结束。 int sum , value;当对象在创建时获得一个特定的值,我们说对象被初始化了。 int sum = 0;int sum = {0};int sum{0};i
当在程序的某处我们使用了一种类型而实际对象应该取另一种类型时,程序会自动进行类型转换。 bool b = 10; //b为真把非布尔型赋予布尔类型时,0为false,否则就是true。 int i = b; //i==1把布尔赋予其他类型时,false转换为0,true转换为1。 i = 3.14 //i==3把浮点数赋予整数,只保留整数部分。 double p = i; //p ==
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号