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 ...
随机推荐
- Java 项目创建 -- 统一结果处理、统一异常处理、统一日志处理
一.IDEA 插件使用 1.说明 此处使用 SpringBoot 2.2.6 .JDK 1.8 .mysql 8.0.18 作为演示. 使用 IDEA 作为开发工具. 2.IDEA 插件 -- Lom ...
- requests库入门笔记1
1.使用requests库发送请求,fiddler无法抓到包:使用浏览器请求相同的url,可以抓到包 在请求参数中添加 proxies参数,如下: proxies = { 'http': 'http: ...
- 还能这么玩?用VsCode画类图、流程图、时序图、状态图...不要太爽!
文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 软件设计中,有好几种图需要画,比如流程图.类图.组件图等,我知道大部分 ...
- CSS(五)- 背景与边框 - 边框圆角与阴影基础用法
扩展阅读 本文仅仅做border的基础使用,想要深入了解的话可以戳以下几个链接,觉得作者写的很好. CSS Backgrounds and Borders Module Level 3 CSS魔法堂: ...
- java 面向对象(三十二):泛型一 泛型的理解
1.泛型的概念所谓泛型,就是允许在定义类.接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型.这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量.创建对象时确定 ...
- scrapy 基础组件专题(七):scrapy 调度器、调度器中间件、自定义调度器
一.调度器 配置 SCHEDULER = 'scrapy.core.scheduler.Scheduler' #表示scrapy包下core文件夹scheduler文件Scheduler类# 可以通过 ...
- java 面向对象(十一):关键字:package/import
1.1 使用说明: * 1.为了更好的实现项目中类的管理,提供包的概念 * 2.使用package声明类或接口所属的包,声明在源文件的首行 * 3.包,属于标识符,遵循标识符的命名规则.规范(xxxy ...
- nodejs之数据库连接
nodejs 对 MySQL.mongodb.redis 数据库的连接方式. MySQL: var mysql = require('mysql') var { MYSQL } = require(' ...
- 拦截器(Interceptor)中的invocation.invoke()是什么意思?
拦截器(Interceptor)中的invocation.invoke()是什么意思? 最佳答案: invocation.invoke() 就是通知struts2接着干下面的事情 比如 调用下一个拦截 ...
- Go Pentester - HTTP Servers(1)
HTTP Server Basics Use net/http package and useful third-party packages by building simple servers. ...