C++类、函数、指针
1、初始化所有指针。
2、
(1)指向常量的指针:
(2)常量指针:指针本身为常量:
3、若循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环。
4、字符数组要注意字符串字面值结尾处还有一个空字符。
5、数组的指针及数组的引用
6、C++中多维数组指的是数组的数组。
7、要使用for循环语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应是引用类型。
8、异常检测&异常处理
throw&try(catch)
9、如果函数无需改变引用形参的值,最好将其声明为常量引用。
10、(1)构造函数
是成员函数的一种,可以有参数,不能有返回值(void也不行)。
作用是对对象进行初始化,例如给成员变量赋初值。若定义类时没有写构造函数,编译器会生成默认的无参数的构造函数,不进行任何操作。
对象生成时构造函数自动被调用,对象一旦生成,就不能在其上执行构造函数。
一个类可以有多个构造函数。
(2)拷贝构造函数
几个原则:
C++ primer p406 :拷贝构造函数是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显示使用拷贝构造函数。当该类型的对象传递给函数或从函数返回该类型的对象时,将隐式调用拷贝构造函数。
X::X( X& )
X::X(const X &)
二者选一,后者能以常量对象作为参数。
C++支持两种初始化形式:
拷贝初始化 int a = 5; 和直接初始化 int a(5); 对于其他类型没有什么区别,对于类类型直接初始化直接调用实参匹配的构造函数,拷贝初始化总是调用拷贝构造函数,也就是说:
A y = x; //拷贝初始化,是初始化语句非赋值语句,会调用拷贝构造函数,与下一条代码等价
A y(x); //调用拷贝构造函数
必须定义拷贝构造函数的情况:
只包含类类型成员或内置类型(但不是指针类型)成员的类,无须显式地定义拷贝构造函数也可以拷贝;有的类有一个数据成员是指针,或者是有成员表示在构造函数中分配的其他资源,这两种情况下都必须定义拷贝构造函数。
什么情况使用拷贝构造函数:
类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:
- (1)用一个对象去初始化同类的另一个对象。
- (2)若某一个函数有一个参数是类A的对象,那么该函数在被调用时,类A的拷贝构造函数将被调用。
- (3)如果函数的返回值是类A的对象,则函数返回时,A的拷贝构造函数将被调用。
(3)特殊的构造函数:类型转换构造函数:
实现类型的自动转换。
特点:只有一个参数,且不是拷贝构造函数。在使用时,编译系统会自动调用,建立一个临时对象/临时变量。
(4)析构函数
特点:名字与类名相同;前面加~;没有参数和返回值;一个类最多有一个析构函数。
对象消亡时自动被调用:释放分配的空间
编译期自动生成的缺省析构函数不涉及释放用户申请的内存释放等清理工作。
对象数组的生命期结束时,对象数组的每个元素的析构函数都会被调用到。
先构造的后析构。
11、静态成员 static:静态成员变量、静态成员函数,不需通过对象就能访问,本质是全局的。
普通成员变量每个对象各自有一份,静态成员变量一共一份,被所有成员共享。必须在定义类的文件中对静态成员变量进行一次说明/初始化,否则编译能通过,链接无法通过。
sizeof运算符不会计算静态成员变量。
calss CMyclass {
int n;
static int s;
};
则 sizeof(CMyclass) =
普通成员函数必须具体作用域某个对象,而静态成员函数并不具体作用于某个对象。
- 静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
- 普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针。
12、类的多继承之环状继承
13、纯虚函数
想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。
告诉编译器,函数没有主体,上面的虚函数是纯虚函数。
14、常引用不能对实参值进行改变。
指向常量的指针,也叫指针常量,该指针变量指向的是一个常量,指针所指的常量不允许改变,但是该指针可以指向其他地址。
常量指针又叫常指针,指的是声明的一个指针变量是一个常量,不可通过常量指针改变其指向的内容。但是该指针所指的对象是可以发生改变的。
不能把常量指针赋值给非常量指针,反过来可以。除非强制类型转换,例如:(int *)
函数参数为常量指针时,可以避免不小心改变参数指针所指向地址的内容。
15、用new实现动态内存分配
分配变量:P=new T; eg:
int *p;
p=new int;
*pn=;
分配数组:P=new T[N];
int *p;
p = new int[;
p[]=;
new的返回值类型 T*
用delete释放内存空间:
delete p;
delete []p;
16、内联函数:
函数调用都是有开销的,若某个函数执行快但被调用很多次,开销大,使用内联函数。编译器处理对内联函数的调用语句时,将整个函数代码插入到调用语句处,而不会产生调用函数的语句。
inline int max(int a,int b)
{
if(a>b) return a;
return b;
}
内联成员函数:(1)inline (2)将整个函数体放在类定义的内部
17、函数重载:一个多个函数,名字不同但参数个数或参数类型不同。
18、类成员可访问范围
public public protected
类的成员函数内部可以访问:(1)当前对象的全部属性、函数 (2)同类其他成员的全部属性、函数
类的成员函数以外的地方只能访问类对象的公有成员(public)
19、负数用十六进制表示,首先将其表示为二进制,变反码再变补码
20、成员对象
成员对象:一个类的成员变量是另一个类的对象。包含成员对象的类叫封闭类。
使用初始化列表设计封闭类的构造函数:类名::构造函数(参数表):成员变量1(参数表),成员变量2(参数表),......{......}
成员函数初始化列表里的参数:任意复杂的表达式;函数/变量/表达式中的函数,变量有定义。
当封闭类对象生成时,先执行所有成员对象的构造函数,再执行封闭类的构造函数。成员对象的构造函数调用顺序与成员对象在类中的说明顺序一致,与在成员函数初始化列表中出现的顺序无关。
21、友元(friend)
(1)友元函数:一个类的友元函数可以访问该类的私有成员;将一个类的成员函数(包括构造、析构函数)定义为另一个类的友元。
(2)友元类:A是B的友元类,则A的成员函数可以访问B的私有成员。Note:友元类之间的关系不能传递、不能继承。
22、this指针:指向成员函数所作用的对象
Note:静态成员函数中不能使用this指针!因为静态成员函数并不具体作用于某个对象,因此静态成员函数的真实参数个数就是程序中写出的参数个数。
23、常量
(1)常量对象 const
(2)常量成员函数:类的成员函数说明后面可以加const。
执行期间不应修改其所作用的对象,因此,常量成员函数中不能修改成员变量的值(静态成员变量除外),也不能调用同类的非常量成员函数(静态成员函数除外)。
Note:两个成员函数,名字和参数表都一样,但一个是const,则算函数重载。
(3)常引用 const int &r = n
不能通过常引用改变其引用的变量 ,一般可作为函数参数。
void PrintObj(const Sample &o)
C++类、函数、指针的更多相关文章
- c++特性:指向类成员的指针和非类型类模板参数和函数指针返回值 参数推导机制和关联型别
一.c++允许定义指向类成员的指针,包括类函数成员指针和类数据成员指针 格式如下: class A { public: void func(){printf("This is a funct ...
- 类成员函数指针 ->*语法剖析
在cocos2d-x中,经常会出现这样的调用,如 ->*,这个是什么意思呢,如下面得这个例子: , 其实这是对类的成员函数指针的调用,在cocos2dx中,这种形式多用于回调函数的调用.如我们经 ...
- C++ 类的成员函数指针 ( function/bind )
这个概念主要用在C++中去实现"委托"的特性. 但现在C++11 中有了 更好用的function/bind 功能.但对于类的成员函数指针的概念我们还是应该掌握的. 类函数指针 就 ...
- C++的类成员和类成员函数指针
类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员 ...
- 使用std::function 把类成员函数指针转换为普通函数指针
前言 这是改造前一篇 设计模式 的基础,使通知者不必知道观察者的类名和函数名,只需要知道更新函数的原型即可. 开发环境:WIN7 32位 + VS2010 发现在VS2005中使用std::funti ...
- C++中怎么获取类的成员函数的函数指针?
用一个实际代码来说明. class A { public: staticvoid staticmember(){cout<<"static"<<endl;} ...
- Qt信号槽机制的实现(面试的感悟,猜测每一个类保存的一个信号和槽的二维表,实际使用函数指针 元对象 还有类型安全的检查设定等等)
因为面试时问了我这道题,导致我想去了解信号槽到底是如何实现的,于是贴着顺序看了下源码,大致了解了整个框架.网上关于信号槽的文章也很多,但是大部分都是将如何应用的,这里我就写一下我所理解的如何实现吧, ...
- VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)
一.关于起因 前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. V ...
- 获取VB类模块成员函数指针(转)
最近在做一些VB6.VBA的项目,被如何获取类模块中的函数指针这个问题所困扰,收集整理后,有2分资料值得收藏,特将关键部分留存,以备后续查找. 参照连接1:http://www.cnblogs.com ...
- C/C++ 类成员函数指针 类成员数据指针
普通函数指针: "return_type (*ptr_name)(para_types) " 类成员函数指针: "return_type (class_name::*p ...
随机推荐
- Python GIL(全局解释器锁)
理解并发和并行 并行:多个CPU同时执行多个不同的多任务. 就像两个程序(进程),这两个程序是真的在不同的CPU内同时执行多个任务. 并发:CPU切换处理不同的多任务, 还是有两个程序,但只有一个CP ...
- Scala 基础(八):Scala 程序流程控制
1.顺序控制 顺序控制介绍 程序从上到下逐行地执行,中间没有任何判断和跳转. 顺序控制举例和注意事项 Scala中定义变量时采用合法的前向引用.如: def main(args : Array[Str ...
- POJ 1095 Trees Made to Order 最详细的解题报告
题目来源:Trees Made to Order 题目大意:根据下面的规则给一棵二叉树编号: 规则1:如果二叉树为空,则编号为0: 规则2:如果二叉树只有一个节点,则编号为1: 规则3:所有含有m个节 ...
- There are unfinished transactions remaining. Please run yum-complete-transaction as root.
问题:CentOS 运行软件更新时,提示如下错误. 解决办法: 在终端界面,运行 sudo yum-complete-transaction.
- View Animation 运行原理解析
Android 平台目前提供了两大类动画,在 Android 3.0 之前,一大类是 View Animation,包括 Tween animation(补间动画),Frame animation(帧 ...
- 牛客练习赛 66B题解
前言 当初思路 开始没想到异或这么多的性质,于是认为对于每个点\(u\),可以和它连边的点\(v\)的点权 \(a_v=a_u \oplus k\)(证明:\(\because\) \(a_u\opl ...
- Mobilenet V1
目录 1. Depth Separable Convolution 2. 网络结构 3. 宽度因子和分辨率因子 4. 代码实现 参考博客: https://cuijiahua.com/blog/201 ...
- Fastjson到了说再见的时候了
生命太短暂,不要去做一些根本没有人想要的东西.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习 ...
- 设计模式:interpreter模式
理解:可以广义的理解为创造一种语言,实现该语言的解释器,然后用创造的语言编写程序 对比:如xml就是一种语言,解析xml的代码就是解释器 例子: //目标:定义4中几种命令,使用C++解析 //如下: ...
- Python数据分析——numpy基础简介
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:基因学苑 NumPy(Numerical Python的简称)是高性 ...