指针

Item 15.指向类数据成员的指针

可紊 提交于 2020-03-30 16:50:28
Item 15. Pointers to Class Members Are Not Pointers Pointers to Class Members:指向类成员的指针 注:本条中只涉及到非静态的数据成员 -------------------------------------------------------- 1、类成员的指针之声明:  class C { public: //... int a_;  };  int C::*pimC; //指向类C成员的指针,这里只是声明 2、类成员的指针之含义:  类成员的指针用“指针”这个词来描述很容易引起混淆,因为类成员的指针和指针的含义大相径庭: 指针包含地址;而类成员的指针并不涉及到内存地址,它只是引用了一个类的某个成员,而不是一个具体的对象的某个成员,类没有内存地址,因此类成员的指针也不能指向内存的某个地方,它通常只是一个偏移量(offset)。然而由于标准C++没有定义类成员的指针的实现,因此各个编译器厂家的实现也不尽相同,但大多数是用一个整数来表示这个偏移量。 pimC = &C::a_; //获取成员a_在C中的偏移量,如果a_为静态成员则pimC指向C::a_的地址 3、访问偏移量对应的数据成员 C aC; C *pC = &aC; aC.*pimC = 0; //*pimC应用到了C的每一个对象上 int b =

指向函数的指针数组

拟墨画扇 提交于 2020-03-30 16:48:25
#include<iostream> using namespace std; int f1() { return 0; } int f2() { return 0; } int f3() { return 0; } int f4() { return 0; } int main() { int (*a[])()={&f1,&f2,&f3,&f4}; for(int i=0;i<4;++i) { a[i](); } } 应该注意的是这几个函数的参数必须一致,比如在这里都为空,同时返回值也必须是同一类型,如 上例返回值为void类型。 在弄清上面的问题的前提是必须清楚 指针函数和函数指针 的区别 指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 函数指针是指向函数的指针变量,即本质是一个指针变量。  int (*f) (int x); /* 声明一个函数指针 */  f=func; /* 将func函数的首地址赋给指针f */ 主要的区别是一个是指针变量,一个是函数。在使用是必要要搞清楚才能正确使用。 来源: https://www.cnblogs.com/zhouyz/archive/2010/08/19/1803997.html

21天学通c++之第二周 指针 8.10 使用指向const对象的指针

霸气de小男生 提交于 2020-03-30 16:47:15
#include <iostream> using namespace std; class Rectangle { public: Rectangle(); ~Rectangle(); void setlength(int length){itslength=length;} int getlength()const{return itslength;} void setwidth(int width){itswidth=width;} int getwidth()const{return itswidth;} private: int itslength; int itswidth; }; Rectangle::Rectangle() { itswidth=5; itslength=10; } Rectangle::~Rectangle() { } int main() { Rectangle* prect=new Rectangle; const Rectangle * pconstrect=new Rectangle; Rectangle * const } 来源: https://www.cnblogs.com/byeday/archive/2008/12/03/1346776.html

智能指针与句柄类(二)

心已入冬 提交于 2020-03-30 16:44:12
   之前文章 提到写时复制(copy-on-write)技术,要实现这种功能,针对上文中Handle代码,需要将size_t * use这个抽象出来,封装成一个引用计数类,提供写时复制功能。CUseCount类实现如下: 1 class CUseCount 2 { 3 public: 4 CUseCount(); 5 CUseCount(const CUseCount&); 6 ~CUseCount(); 7 8 bool only()const; //判断引用计数是否为0, 句柄类无法访问private int*p, 故提供此函数 9 bool reattach(const CUseCount&); //对计数器的操作, 用来代替 operator = 10 11 bool makeonly(); //写时复制, 表示是否需要赋值对象本身 12 13 private: 14 CUseCount& operator=(const CUseCount&); //提供reattach函数代替 operator = 15 int *p; //实现计数 16 }; 17 18 CUseCount::CUseCount():p(new int(1)) 19 {} 20 21 CUseCount::CUseCount(const CUseCount& u):p(u.p) 22 { 23 ++

类的this指针

空扰寡人 提交于 2020-03-30 16:42:35
   类的this指针有以下特点:    (1)this只能在成员函数中使用。   全局函数、静态函数都不能使用this。   实际上,成员函数默认第一个参数为T* const this。   如: class A{public: int func(int p) {}}; 其中,func的原型在编译器看来应该是: int func(A* const this, int p); (2)由此可见,this在成员函数的开始前构造,在成员的结束后清除。   这个生命周期同任何一个函数的参数是一样的,没有任何区别。   当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。如: A a;a.func(10); 此处,编译器将会编译成: A::func(&a, 10); 看起来和静态函数没差别,对吗?不过,区别还是有的。编译器通常会对this指针做一些优化,因此,this指针的传递效率比较高——如VC通常是通过ecx寄存器传递this参数的。    (3)几个this指针的易混问题。    1)this指针是什么时候创建的?   this在成员函数的开始执行前构造,在成员的执行结束后清除。   但是如果class或者struct里面没有方法的话,它们是没有构造函数的,只能当做C的struct使用。采用TYPE xx的方式定义的话,在栈里分配内存

C++ 指向数组的指针

僤鯓⒐⒋嵵緔 提交于 2020-03-30 16:08:14
如果您对 C++ 指针的概念有所了解,那么就可以开始本章的学习。数组名是一个指向数组中第一个元素的常量指针。因此,在下面的声明中: double balance[50]; balance 是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址。因此,下面的程序片段把 p 赋值为 balance 的第一个元素的地址: double *p; double balance[10]; p = balance; 使用数组名作为常量指针是合法的,反之亦然。因此,*(balance + 4) 是一种访问 balance[4] 数据的合法方式。 一旦您把第一个元素的地址存储在 p 中,您就可以使用 *p、*(p+1)、*(p+2) 等来访问数组元素。下面的实例演示了上面讨论到的这些概念: #include <iostream> using namespace std; int main () { // 带有 5 个元素的整型数组 double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0}; double *p; p = balance; // 输出数组中每个元素的值 cout << "使用指针的数组值 " << endl; for ( int i = 0; i < 5; i++ ) { cout << "*(p + " <<

数组指针和指针数组的区别

别说谁变了你拦得住时间么 提交于 2020-03-30 14:25:57
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a

C++ static_cast

社会主义新天地 提交于 2020-03-30 12:07:01
static_cast 编辑 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。 中文名 暂无 外文名 static_cast 分 类 强制类型转换 类 型 C++ static_cast 目录 1 用法 2 简介 用法 编辑 static_cast < type-id > ( expression ) 简介 编辑 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法: ①用于 类层次结构 中基类(父类)和 派生类 (子类)之间指针或引用的转换。 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的; 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。 ②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。 ③把空指针转换成目标类型的空指针。 ④把任何类型的表达式转换成void类型。 注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。 C++中static_cast和 reinterpret_cast 的区别 C++primer 第四版第五章里写了 编译器 隐式执行任何 类型转换

2020.3.23第四次作业

你说的曾经没有我的故事 提交于 2020-03-30 02:58:57
一、学习笔记 学习范围:3.2.1结构类型、3.2.2结构与函数、3.2.3 结构中的结构 二、相关程序 三、遗留问题 对于以下结构定义, ++p->str 中的 ++ 加在__ D __。 (2分) struct { int len; char *str; } *p; A. 指针str上 B.指针p上 C.str指的内容上 D.以上均不是 解析:p是一个结构体指针,结构体指针访问成员用"->",结构体变量用"." 来源: https://www.cnblogs.com/qipaopao001120/p/12571345.html