Cpp构造函数和析构函数
C++中的构造函数与java的差不多,析构函数则有点点像java中的finalize().
C++ 类构造函数 & 析构函数类的构造函数类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。
构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。
下面的实例有助于更好地理解构造函数的概念:
1234567891011121314151617181920212223242526272829303132333435363738394041#include <iostream> using namespace std; class Line{ public: void setLength( double len ); double getLength( void ); Line(); // 这是构造函数 private: double length;}; // 成员函数定义,包括构造函数Line::Line(voi ...
Cpp继承
看看C++中的继承有什么与java不一样的.
C++ 继承面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行时间的效果。
当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
继承代表了 is a 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。
基类 & 派生类一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名,形式如下:
1class derived-class: access-specifier base-class
其中,访问修饰符 access-specifier 是 public、protected 或 private 其中的一个,base-class 是之前定义过的某个类的名称。如果未使用访问修饰符 access-specifier,则默认为 priv ...
Cpp类访问修饰符
C++的类访问修饰符和Java的有一点很大的区别,那就是不可以用来单独修饰某个类,修饰符本身用于成员和继承.
C++ 类访问修饰符数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的访问限制是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。
一个类可以有多个 public、protected 或 private 标记区域。每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的。成员和类的默认访问修饰符是 private。
123456789101112131415class Base { public: // 公有成员 protected: // 受保护成员 private: // 私有成员 };
公有(public)成员公有成员在程序中类的外部是可访问的。您可以不使用任何成员函数来设置和获取公有变量的值,如下所示:
12345678910111213141516 ...
Cpp结构体
补充一些结构体的知识.
1. 结构体(struct)1.1 结构体的概念
结构体(struct):是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。
结构体(struct):是一种复合数据类型,结构类型。注:“结构”是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构即是一种“构造”而成的数据类型, 那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义一样。
1.2 C语言中的结构体
说明:在C语言中,结构体(struct)是复合数据类型的一种。同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同的类型,成员一般用名字访问。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。注:在C语言中,结构体不能包含函数。
定义与声明:(1)示例代码一:
12345678struct tag { member-list}variable-list;注:struct为结构体关键字; tag为结构体的标志; member-list为结构体 ...
指针探幽2
再补充一些关于指针的注意点.
一.野指针及C++指针使用注意点避免野指针的产生
“野指针”的成因主要有:
1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
1char *p; //此时p为野指针
2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针.
123char *p=new char[10]; //指向堆中分配的内存首地址,p存储在栈区cin>> p;delete []p; //p重新变为野指针
3)指针操作超越了变量的作用范围。
123char *p=new char[10]; //指向堆中分配的内存首地址cin>> p;cout<<*(p+10); //可能输出未知数据
指针的注意点:
a.指针指向常量存储区对象
1char *p="abc";
此时p指向的是一个字符串常量,不能对*p的内容进行写操作,如s ...
Cpp数字
数学运算和生成随机数.
C++ 数学运算在 C++ 中,除了可以创建各种函数,还包含了各种有用的函数供您使用。这些函数写在标准 C 和 C++ 库中,叫做内置函数。您可以在程序中引用这些函数。
C++ 内置了丰富的数学函数,可对各种数字进行运算。下表列出了 C++ 中一些有用的内置的数学函数。
为了利用这些函数,您需要引用数学头文件 ****。
序号
函数 & 描述
1
double cos(double); 该函数返回弧度角(double 型)的余弦。
2
double sin(double); 该函数返回弧度角(double 型)的正弦。
3
double tan(double); 该函数返回弧度角(double 型)的正切。
4
double log(double); 该函数返回参数的自然对数。
5
double pow(double, double); 假设第一个参数为 x,第二个参数为 y,则该函数返回 x 的 y 次方。
6
double hypot(double, double); 该函数返回两个参数的平方总和的平方根,也就是说 ...
指针常量OR常量指针
指针常量OR常量指针,傻傻搞不清.
先找到,然后看的两边,右边是对指针p本身的限定,左边是对p所指向的东西的限定。
注:本文中我们将p的所指笼统地称为“东西”。
例如
1.const int p右边没有限定成分,表明p就是我们熟悉的普通指针,p的内容(即值,也就是它指向的东西的地址)是可以改变的;的左边是const int,表明p指向的东西是一个const的int,我们不能通过p来修改这个int,因为它是const的。(关于“不能通过p来修改”,我们后边还会详细解释)
2.int* const p右边是const,表明p本身是const的,我们不能对p的内容进行修改(例如++p;是不可以的),的左边是int,即p指向的东西是普通的int,我们可以通过p来修改它(例如p=100;是可以的)。
3.const int* const p右边是const,表明指针p本身是const的,*的左边是const int,表明p指向的int也是const的。即这种情况下,p本身不能修改,同时也不能通过p修改它所指向的那个int。
Cpp中引用到底占不占空间
先放结论:对于C++标准来说,不占,确切说,未指定;对于程序来说,使用&来查看引用的地址,发现指向引用对象的地址,可以看做不占;对于编译器来说,是占用的,因为要实现前面这种效果,不可能凭空而来.
首先,对于C++标准,它是这么说的:
8.3.24 It is unspecified whether or not a reference requires storage (3.7).
也就是,标准并不关心引用是如何实现的(事实上,标准对于很多东西只规定了要什么样的,没规定具体怎么做).
目前,引用的实现方式就是使用常量指针.
https://blog.csdn.net/feigegegegegegegeg/article/details/52613627
http://www.cnblogs.com/rollenholt/articles/1907408.html
下面举个例子:int a = 10;int &b = a;
这里,显然,b是一个引用。语句“int a = 10;”,在内存中申请了一个int型变量,32位机中占4个字节,那 ...
Cpp引用
对于引用和指针有点搞不清楚.
说到引用,先来讲一个故事:我们生活的院子里有这样一个小盆友,他的名字叫罗XX,我们喜欢给他起一个外号,看着他营养不太好,脑袋比较大、身子比较小,于是我们就给他起了一个叫”萝卜头”的外号。那么罗XX就是他的真实姓名,萝卜头就是他的一个别名,那么什么是引用呢??
定义:引用:就是变量的一个别名。
注:作为别名来说,一个变量不能只有别名,而没有自己的真实姓名。
基本数据类型的引用如下面的一段代码:
12345678910#include <iostream>using namespace std;{ int a = 3; int &b = a; //b就是a的引用,即b是a的一个别别名。 //引用必须初始化,否则编译会报错 b = 10; cout<< a << endl; //此时a 的值,已由原来的3变成了10.因为我们无论对别名做什么操作,其实都是对变量的本身做操作。就像我们去交萝卜头去干什么,罗XX本身就去干什么。 return 0 ...
Cpp Lambda表达式
Lambda表达式是C++11的新特性,了解一下.
>
如下图,lambda表达式由下面几个部分构成:
lambda表达式的语法归纳如下:
[ caputrue ] ( params ) opt -> ret { body; };
1).capture是捕获列表;
2).params是参数表;(选填)
3&4).opt是函数选项;可以填mutable,exception,attribute(选填)
mutable说明lambda表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获的对象的non-const方法。
exception说明lambda表达式是否抛出异常以及何种异常。
attribute用来声明属性。
5).ret是返回值类型。(选填)
6).body是函数体。
1234567891011121314151617181920212223242526#include <iostream>#include <vector>#include <algorithm>using namespace std;bool cmp( ...