C++(菜鸟教程)
全局变量和和局部变量同名时,可通过域名在函数中引⽤到全局变量,不加域名解析则引⽤局部变量
#include<iostream>
using namespace std;
int a =10;
int main(){
int a =20;
cout <<::a << endl;// 10
cout << a << endl;// 20
return0;
}
Lambda 函数与表达式
C++11 提供了对匿名函数的⽀持,称为 Lambda 函数(也叫 Lambda 表达式)。
Lambda 表达式把函数看作对象。Lambda 表达式可以像对象⼀样使⽤,⽐如可以将它们赋给变量和作为参数传递,还可以像函数⼀样对其求值。
Lambda 表达式本质上与函数声明⾮常类似。Lambda 表达式具体形式如下:
[]:默认不捕获任何变量;
[=]:默认以值捕获所有变量;
[&]:默认以引⽤捕获所有变量;
[x]:仅以值捕获x,其它变量不捕获;
[&x]:仅以引⽤捕获x,其它变量不捕获;
[=, &x]:默认以值捕获所有变量,但是x是例外,通过引⽤捕获;
[&, x]:默认以引⽤捕获所有变量,但是x是例外,通过值捕获;
[this]:通过引⽤捕获当前对象(其实是复制指针);
C++ 随机数
在许多情况下,需要⽣成随机数。关于随机数⽣成器,有两个相关的函数。⼀个是 rand(),该函数只返回⼀个伪随机数。⽣成随机数之前必须先调⽤ srand() 函数。
下⾯是⼀个关于⽣成随机数的简单实例。实例中使⽤了 time() 函数来获取系统时间的秒数,通过调⽤ rand() 函数来⽣成随机数:[*this]:通过传值⽅式捕获当前对象;
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
int main ()
{
int i,j;
// 设置种⼦
srand((unsigned)time(NULL));
/* ⽣成 10 个随机数 */
for( i =0; i <10; i++)
{
菜鸟教程python函数// ⽣成实际的随机数
j=rand();
cout <<"随机数: "<< j << endl;
}
return0;
}
虚拟继承格式
另外多继承(环状继承),A->D, B->D, C->(A,B),例如:
class D{…};
class B: public D{…};
class A: public D{…};
class C: public B, public A{…}; 这个继承会使D创建两个对象,要解决上⾯问题就要⽤虚拟继承格式 格式:class 类名: virtual 继承⽅式 ⽗类名
class D{…};
class B: virtual public D{…};
class A: virtual public D{…};
class C: public B, public A{…};
C++ 多态:C++ 多态意味着调⽤成员函数时,会根据调⽤函数的对象的类型来执⾏不同的函数。下⾯的实例中,基类 Shape 被派⽣为两个类,如下所⽰:
#include<iostream>
using namespace std;
class Shape {
protected:
int width, height;
public:
Shape(int a=0,int b=0)
{
width = a;
height = b;
}
int area()
{
cout <<"Parent class area :"<<endl;
return0;
}
};
class Rectangle:public Shape{
public:
Rectangle(int a=0,int b=0):Shape(a, b){}
int area ()
{
cout <<"Rectangle class area :"<<endl;
return(width * height);
}
};
class Triangle:public Shape{
public:
Triangle(int a=0,int b=0):Shape(a, b){}
int area ()
{
cout <<"Triangle class area :"<<endl;
return(width * height /2);
}
};
// 程序的主函数
int main()
{
Shape *shape;
Rectangle rec(10,7);
Triangle  tri(10,5);
// 存储矩形的地址
shape =&rec;
/
/ 调⽤矩形的求⾯积函数 area
shape->area();
// 存储三⾓形的地址
shape =&tri;
// 调⽤三⾓形的求⾯积函数 area
shape->area();
return0;
}
当上⾯的代码被编译和执⾏时,它会产⽣下列结果:
Parent class area
Parent class area
导致错误输出的原因是,调⽤函数 area() 被编译器设置为基类中的版本,这就是所谓的静态多态,或静态链接 - 函数调⽤在程序执⾏前就准备好了。有时候这也被称为早绑定,因为 area() 函数在程序编译期间就已经设置好了。但现在,让我们对程序稍作修改,在 Shape 类中,area() 的声明前放置关键字 virtual,如下所⽰:
class Shape {
protected:
int width, height;
public:
Shape(int a=0,int b=0)
{
width = a;
height = b;
}
virtual int area()
{
cout <<"Parent class area :"<<endl;
return0;
}
};
修改后,当编译和执⾏前⾯的实例代码时,它会产⽣以下结果:
Rectangle class area
Triangle class area
虚函数
虚函数 是在基类中使⽤关键字 virtual 声明的函数。在派⽣类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。我们想要的是在程序中任意点可以根据所调⽤的对象类型来选择调⽤的函数,这种操作被称为动态链接,或后期绑定。
纯虚函数
您可能想要在基类中定义虚函数,以便在派⽣类中重新定义该函数更好地适⽤于对象,但是您在基类中⼜不能对虚函数给出有意义的实现,这个时候就会⽤到纯虚函数。
我们可以把基类中的虚函数 area() 改写如下:
class Shape {
protected:
int width, height;
public:
Shape(int a=0,int b=0)
{
width = a;
height = b;
}
// pure virtual function
virtual int area()=0;
};
= 0 告诉编译器,函数没有主体,上⾯的虚函数是纯虚函数。
new 和 delete 运算符
下⾯是使⽤ new 运算符来为任意的数据类型动态分配内存的通⽤语法:
new data-type;
在这⾥,data-type 可以是包括数组在内的任意内置的数据类型,也可以是包括类或结构在内的⽤户⾃定义的任何数据类型。让我们先来看下内置的数据类型。例如,我们可以定义⼀个指向 double 类型的指针,然后请求内存,该内存在执⾏时被分配。我们可以按照下⾯的语句使⽤ new 运算符来完成这点:
double* pvalue = NULL; // 初始化为 null 的指针 pvalue = new double; //为变量请求内存
如果⾃由存储区已被⽤完,可能⽆法成功分配内存。所以建议检查 new 运算符是否返回 NULL 指针,并采取以下适当的操作:
>double* pvalue  =NULL;
>if(!(pvalue  =new double)){
>    cout <<"Error: out of memory."<<endl;
>exit(1);
>}
malloc() 函数在 C 语⾔中就出现了,在 C++ 中仍然存在,但建议尽量不要使⽤ malloc() 函数。new 与 malloc() 函数相⽐,其主要的优点是,new 不只是分配了内存,它还创建了对象。
在任何时候,当您觉得某个已经动态分配内存的变量不再需要使⽤时,您可以使⽤ delete 操作符释放它所占⽤的内存,如下所⽰:delete pvalue; // 释放 pvalue 所指向的内存
下⾯的实例中使⽤了上⾯的概念,演⽰了如何使⽤ new 和 delete 运算符:
#include<iostream>
using namespace std;
int main ()
{
double* pvalue  =NULL;// 初始化为 null 的指针
pvalue  =new double;// 为变量请求内存
*pvalue =29494.99;// 在分配的地址存储值
cout <<"Value of pvalue : "<<*pvalue << endl;
delete pvalue;// 释放内存
return0;
}
当上⾯的代码被编译和执⾏时,它会产⽣下列结果:
Value of pvalue : 29495

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。