C++中this指针的用法
探讨一下构造函数中base和this的用法与区别
探讨一下构造函数中base和this的用法与区别(C#版)探讨一下构造函数中base和this的用法与区别(C#版)这篇文章主要介绍一下在构造函数中base和this的用法和区别的。
接下来的文章会陆续介绍一下静态变量和静态构造函数。
希望大家能够将意见反馈给我。
代码最具有说服性了,看下面代码吧://代码段一public class ConstructorProgram1{private string name;public ConstructorProgram1(){Console.WriteLine("No Info Left");}public ConstructorProgram1(string name){ = name;Console.WriteLine("name=" + );}}这里我重载了另外一个构造函数,里面的this作为一个指针指示了一个类的引用。
即是ConstructorProgram1类的引用。
这个很简单,但不是重点。
这篇文章最重点要说一下:this和base在构造函数中扮演的角色。
看下面的代码:public class ConstructorProgram{private string name;private int age;public ConstructorProgram():this("bell"){//Console.WriteLine("No Info Left.");}public ConstructorProgram(string name):this("Simple Programmer",20){ = name;Console.WriteLine("name=" + );}public ConstructorProgram(string name, int age){ = name;this.age = age;Console.WriteLine("name=" + );Console.WriteLine("age=" + this.age);}public static void Main(){ConstructorProgram cp1= new ConstructorProgram("goal");ConstructorProgram cp2 = new ConstructorProgram();}}运行结果:name=Simple Programmerage=20name=goalname=Simple Programmerage=20name=bell在上面的代码当中,可以看出来这里红色字体的this用来调用ConstructorProgram类的自身的构造函数。
this指针及用法
this指针及用法this指针是C++中的一个特殊指针,它指向当前对象的地址。
它主要用于在类的成员函数中访问当前对象的成员变量和成员函数。
使用this指针有以下几个方面的用法:1. 访问成员变量:在类的成员函数中,可以使用this指针来访问当前对象的成员变量。
这是因为成员函数中的变量名可能与成员变量名相同,使用this指针可以明确指出要访问的是成员变量而不是局部变量。
例如:cpp.class MyClass {。
public:void setX(int x) {。
this->x = x; // 使用this指针访问成员变量x.}。
private:int x;};2. 返回当前对象:在类的成员函数中,可以使用this指针返回当前对象的引用。
这可以方便地实现链式调用。
例如:cpp.class MyClass {。
public:MyClass& setX(int x) {。
this->x = x;return this; // 返回当前对象的引用。
}。
private:int x;};3. 在构造函数中使用:在构造函数中,this指针指向正在创建的对象。
这可以用于在构造函数中进行成员变量的初始化。
例如: cpp.class MyClass {。
public:MyClass(int x) {。
this->x = x; // 使用this指针初始化成员变量x.}。
private:int x;};4. 解决命名冲突:当类的成员变量与函数参数或局部变量同名时,可以使用this指针来区分它们。
例如:cpp.class MyClass {。
public:void setData(int data) {。
this->data = data; // 使用this指针访问成员变量data.}。
private:int data;};总结起来,this指针在C++中用于在类的成员函数中访问当前对象的成员变量和成员函数,解决命名冲突以及返回当前对象的引用。
c++this的用法
c++this的用法在C++中,this是一个特殊的指针,它指向当前对象的地址。
this常常在类方法中使用,用于在类方法中访问对象的成员变量和成员函数。
一、this的基本用法在类方法中,this指针指向调用该方法的对象。
通过使用this指针,可以在类方法中直接访问对象的成员变量和成员函数,而无需使用对象名。
例如:```cppclassMyClass{intx;public:voidsetX(intvalue){x=value;//直接访问成员变量,无需使用对象名}voidprintX(){cout<<x;//直接访问成员变量,无需使用对象名,也可以使用this->x}};```在上面的例子中,setX()和printX()都是类方法,它们都使用了this指针来访问对象的成员变量x。
二、this的注意事项1.避免重复使用对象名和this指针:在类方法中,尽量避免重复使用对象名和this指针来访问对象的成员变量和成员函数。
这会导致代码冗余和难以阅读。
2.使用this指针时需要小心指针赋值:如果一个类方法被另一个类方法返回,并且该方法返回一个指向当前对象的指针,那么这个指针需要使用对象的地址来赋值。
否则,会导致悬空指针或未定义的行为。
3.this指针是类的内部指针:this指针是类的内部指针,不应该被外部代码直接访问。
如果外部代码需要访问对象的成员变量和成员函数,应该使用对象名来访问。
4.this指针的传递:如果需要在类方法中使用其他类的方法,可以将this 指针作为参数传递给其他类的方法。
但是需要注意,传递this指针可能会导致代码难以理解和维护。
三、this的常见用法示例下面是一些使用this指针的常见用法示例:1.在构造函数中使用this指针:在构造函数中,可以使用this指针来访问对象的成员变量和成员函数。
例如:```cppclassMyClass{intx;public:MyClass(intvalue):x(value){}//使用this指针初始化成员变量x};```2.在析构函数中使用this指针:在析构函数中,可以使用this指针来释放对象的资源。
vc++实现非窗口类中使用定时器的方法
vc++实现非窗口类中使用定时器的方法2010-09-17 21:44:35| 分类:默认分类| 标签:非窗口回调函数|字号大中小订阅定时器在视窗系统的程式中的作用不可忽略,也随处可见。
设定一个时间间隔每0.5秒或1秒钟刷新一次时钟,这样就能完成一个简单的电子钟程式。
在不同的编程工具中定时器的用法也不同,Visual C++中也给我们提供了实现这种功能的方法,而且方法不只一种。
在窗口类中是使用定时器比较简单,用SetTimer()设置了定时器之后,并在Class Wizard中添加了WM_TIMER消息映射后,你就能在映射函数OnTimer()中添加代码实现,来定时完成你的任务,而且还支持任意多个定时器,这种方法大家可能都会用。
不过在非窗口的类中,使用定时器就没那么简单了,在类消息映射中就未找到OnTimer()方法了,类中也没有hWnd 这个属性,SetTimer()也不能象原来那样使用了,下面给出了一种既不破坏类的完整性的同时又能巧妙的使用定时器的方法。
一、实现方法在非窗口类中使用定时器,需要了解的知识比较多。
首先非窗口类中没有消息映射,也没有象CWnd 类具有的SetTimer()方法来设置定时器。
没有消息映射,就只能靠我们自己定义的回调函数来处理定时器的消息,因此大家有必要了解一下回调函数的概念。
因为回调函数只能用全局函数或静态成员函数来实现,而为了维持类的完整性,又需求使用类的静态成员函数来作为回调函数,所以我们又需要了解一下静态数据成员和静态成员函数的性质。
又因为定时器是在我们的程式中产生的,这又需要来管理定时器,所以又用到了映射表类CMap,因此介绍一下CMap的简单用法也是必不可少的。
所谓回调函数就是按照一定的形式由研发人员定义并编写实现内容,当发生某种事件时由系统或其他函数来调用的函数。
使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己编写的一个函数(也就是回调函数)的地址作为参数传递给那个函数。
c#this 的使用方法
this(C# 参考)this关键字引用类的当前实例。
以下是this的常用用途:∙限定被相似的名称隐藏的成员,例如:复制代码public Employee(string name, string alias){ = name;this.alias = alias;}∙将对象作为参数传递到其他方法,例如:复制代码CalcTax(this);∙声明索引器,例如:复制代码public int this [int param]{get { return array[param]; }set { array[param] = value; }}由于静态成员函数存在于类一级,并且不是对象的一部分,因此没有this指针。
在静态方法中引用this是错误的。
示例在本例中,this用于限定Employee类成员name和alias,它们都被相似的名称隐藏。
this还用于将对象传递到属于其他类的方法CalcTax。
复制代码// keywords_this.cs// this exampleusing System;class Employee{private string name;private string alias;private decimal salary = 3000.00m;// Constructor:public Employee(string name, string alias){// Use this to qualify the fields, name and alias: = name;this.alias = alias;}// Printing method:public void printEmployee(){Console.WriteLine("Name: {0}\nAlias: {1}", name, alias);// Passing the object to the CalcTax method by using this: Console.WriteLine("Taxes: {0:C}", Tax.CalcTax(this));}public decimal Salary{get { return salary; }}}class Tax{public static decimal CalcTax(Employee E){return 0.08m * E.Salary;}}class MainClass{static void Main(){// Create objects:Employee E1 = new Employee("John M. Trainer", "jtrainer");// Display results:E1.printEmployee();}}输出Name: John M. TrainerAlias: jtrainerTaxes: $240.00比如你的类中有一个成员变量为a。
C++中this指针的用法详解
C++中this指针的⽤法详解1. this指针的⽤处: ⼀个对象的this指针并不是对象本⾝的⼀部分,不会影响sizeof(对象)的结果。
this作⽤域是在类内部,当在类的⾮静态成员函数中访问类的⾮静态成员的时候,编译器会⾃动将对象本⾝的地址作为⼀个隐含参数传递给函数。
也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为⾮静态成员函数的隐含形参,对各成员的访问均通过this进⾏。
例如,调⽤date.SetMonth(9) <==> SetMonth(&date, 9),this帮助完成了这⼀转换 .2. this指针的使⽤:⼀种情况就是,在类的⾮静态成员函数中返回类对象本⾝的时候,直接使⽤ return *this;另外⼀种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。
3. this指针程序⽰例:this指针存在于类的成员函数中,指向被调⽤函数所在的类实例的地址。
根据以下程序来说明this指针#include class Point { int x, y; public: Point(int a, int b) { x=a; y=b;} void MovePoint( int a, int b){ x+=a; y+=b;} void print(){ cout<<"x="<<x<<"y="<<y<<endl;} <="" font=""> }; void main( ) { Point point1( 10,10); point1.MovePoint(2,2); point1.print(); }当对象point1调⽤MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。
java中的this和super的作用和异同和C++中调用父类的构造函数
java中的this和super的作⽤和异同和C++中调⽤⽗类的构造函数这⼏天看到类在继承时会⽤到this和super,这⾥就做了⼀点总结,与各位共同交流,有错误请各位指正~thisthis是⾃⾝的⼀个对象,代表对象本⾝,可以理解为:指向对象本⾝的⼀个指针。
this的⽤法在java中⼤体可以分为3种:1.普通的直接引⽤这种就不⽤讲了,this相当于是指向当前对象本⾝。
2.形参与成员名字重名,⽤this来区分:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17class Person {private int age = 10;public Person(){System.out.println("初始化年龄:"+age);}public int GetAge(int age){this.age = age;return this.age;}}public class test1 {public static void main(String[] args) {Person Harry = new Person();System.out.println("Harry's age is "+Harry.GetAge(12)); }}运⾏结果:初始化年龄:10Harry's age is 12可以看到,这⾥age是GetAge成员⽅法的形参,this.age是Person类的成员变量。
3.引⽤构造函数这个和super放在⼀起讲,见下⾯。
supersuper可以理解为是指向⾃⼰超(⽗)类对象的⼀个指针,⽽这个超类指的是离⾃⼰最近的⼀个⽗类。
super也有三种⽤法:1.普通的直接引⽤与this类似,super相当于是指向当前对象的⽗类,这样就可以⽤super.xxx来引⽤⽗类的成员。
2.⼦类中的成员变量或⽅法与⽗类中的成员变量或⽅法同名12 3 4 5 6 7 8 9 10 11 12 13class Country {String name;void value() {name = "China";}}class City extends Country {String name;void value() {name = "Shanghai";super.value(); //调⽤⽗类的⽅法 System.out.println(name);13 14 15 16 17 18 19 20 21 System.out.println(name);System.out.println();}public static void main(String[] args) { City c=new City();c.value();}}运⾏结果:ShanghaiChina可以看到,这⾥既调⽤了⽗类的⽅法,也调⽤了⽗类的变量。
CC++编译器-cl.exe的命令选项
C/C++编译器-cl.exe的命令选项和在IDE中编译相比,命令行模式编译速度更快,并可以避免被IDE产生的一些附加信息所干扰。
本文将介绍微软C/C++编译器命令行模式设定和用法。
1、设置环境变量:PA TH=C:\Program Files\Microsoft Visual Studio 8\VC\binINCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\include LIB=C:\Program Files\Microsoft Visual Studio 8\VC\lib如果提示找不到mspdb80.dll文件,则从C:\Program Files\Microsoft Visual Studio 8\Common7\IDE下拷贝“msobj80.dll,mspdb80.dll,mspdbcore.dll,mspdbsrv.exe”这四个文件到C:\Program Files\Microsoft Visual Studio 8\VC\bin下即可。
2、命令选项:1) /C:在预处理输出中保留注释语句2) /c:只编译,不连接,相当于在"Build"菜单下选择了"Compile"3) /D:定义常量和宏,与源程序里的#define 有相同效果4) /E:预处理C、C++源文件,将源文件中所有的预编译指令及宏展开,将注释去掉,然后将预处理器的输出拷贝至标准输出设备输出,并且在每个文件的开头和末尾加入#line5) /EH:指定编译器用何种异常处理模型6) /EP:同/E,只是去掉了#line7) /F:设置程序的堆栈大小8) /FA:设置生成何种列表文件(汇编、汇编与机器码、汇编与源码、汇编与机器码以及源码)9) /Fa:指定用/FA设置的列表文件的存放路径及(或)文件名10) /FD:生成文件的相互依赖信息11) /Fd:设置程序数据库文件(PDB)的存放路径及(或)文件名12) /Fe:设置最终可执行文件的存放路径及(或)文件名13) /FI:预处理指定的头文件,与源文件中的#include有相同效果14) /Fm:创建map文件15) /Fo:设置编译后Obj文件的存放路径及(或)文件名16) /Fp:设置预编译文件(pch)的存放路径及(或)文件名17) /FR:生成浏览信息(sbr)文件18) /Fr:同/FR,不同之处在于/Fr不包括局部变量信息19) /G3:为80386处理器优化代码生成20) /G4:为80486处理器优化代码生成21) /G5:为Pentium处理器优化代码生成22) /G6:为Pentium Pro处理器优化代码生成23) /GA:为Windows应用程序作优化24) /GB:为Pentium处理器优化代码生成,使用80386、80486、Pentium、Pentium Pro的混合指令集,是代码生成的默认选项(程序属性选项中Processor对应Blend)25) /GD:为Windows动态库(dll)作优化,此开关在VC6中没有实现26) /Gd:指定使用__cdecl的函数调用规则27) /Ge:激活堆栈检测28) /GF:消除程序中的重复的字符串,并将她放到只读的缓冲区中29) /Gf:消除程序中的重复字符串30) /Gh:在每个函数的开头调用钩子(hook)函数--penter31) /Gi:允许渐进编译32) /Gm:允许最小化rebuild33) /GR:允许运行时类型信息(Run-Time Type Infomation)34) /Gr:指定使用__fastcall的函数调用规则35) /Gs:控制堆栈检测所用内存大小36) /GT:支持用__declspec(thread)分配的数据的fier-safety37) /GX:允许同步异常处理,与/EHsc开关等价38) /Gy:允许编译器将每一个函数封装成COMDA Ts的形式,供连接器调用39) /GZ:允许在Debug build 的时候捕捉Release build的错误40) /Gz:指定使用__stdcall的函数调用规则41) /H:限制外部名字的长度42) /HELP:列出编译器的所有的命令开关43) /I:指定头文件的搜索路径44) /J:将char的缺省类型从signed char改成unsigned char45) /LD:创建一个动态连接库46) /LDd:创建一个Debug版本的动态链接库47) /link:将指定的选项传给连接器48) /MD:选择多线程、DLL版本的C Run-Time库49) /MDd:选择多线程、DLL、Debug版本的C Run-Time库50) /ML:选择单线程版本的C Run—Time库51) /MLd:选择单线程、Debug版本的C Run—Time库52) /MT:选择多线程版本的C Run-Time库53) /MTd:选择多线程、Debug版本的C Run—Time库54) /nologo:不显示程序的版权信息55) /O1:优化使产生的可执行代码最小56) /O2:优化使产生的可执行代码速度最快57) /Oa:指示编译器程序里没有使用别名,可以提高程序的执行速度58) /Ob:控制内联(inline)函数的展开59) /Od:禁止代码优化60) /Og:使用全局优化61) /Oi:用内部函数去代替程序里的函数调用,可以使程序运行的更快,但程序的长度变长62) /Op:提高浮点数比较运算的一致性63) /Os:产生尽可能小的可执行代码64) /Ot:产生尽可能块的可执行代码65) /Ow:指示编译器在函数体内部没有使用别名66) /Ox:组合了几个优化开关,达到尽可能多的优化67) /Oy:阻止调用堆栈里创建帧指针68) /Q1f:对核心级的设备驱动程序生成单独的调试信息69) /QI0f:对Pentium 0x0f错误指令作修正70) /Qifdiv:对Pentium FDIV错误指令作修正71) /P:将预处理输出写到指定文件里,文件的后缀名为I72) /TC:将命令行上的所有文件都当作C源程序编译,不管后缀名是否为.c73) /Tc:将指定的文件当作C源程序编译,不管后缀名是否为.c74) /TP:将命令行上的所有文件都当作C++源程序编译,不管后缀名是否为.cpp75) /Tp:将指定文件当作C++源程序编译,不管后缀名是否为.cpp76) /U:去掉一个指定的前面定义的符号或常量77) /u:去掉所有前面定义的符号或常量78) /V:在编译的obj文件里嵌入版本号79) /vd:禁止/允许构造函数置换80) /vmb:选择指针的表示方法,使用这个开关,在声明指向某个类的成员的指针之前,必须先定义这个类81) /vmg:选择指针的表示方法,使用这个开关,在声明指向某个类的成员的指针之前,不必先定义这个类,但要首先指定这个类是使用何种继承方法82) /vmm:设置指针的表示方法为Single Inheritance and MultipleInheritance83) /vms:设置指针的表示方法为Single Inheritance84) /vmv:设置指针的表示方法为Any class85) /W:设置警告等级86) /w:禁止所有警告87) /X:阻止编译器搜索标准的include 目录88) /Yc:创建预编译头文件(pch)89) /Yd:在所有的obj文件里写上完全的调试信息90) /Y u:在build过程中使用指定的预编译头文件91) /YX:指示编译器若预编译头文件存在,则使用它,若不存在,则创建一个92) /Z7:生成MSC7.0兼容的调试信息93) /Za:禁止语言扩展(Microsoft Extensions to C)94) /Zd:调试信息只包含外部和全局的符号信息以及行号信息95) /Ze:允许语言扩展(Microsoft Extensions to C)96) /Zg:为源文件里面定义的每个函数生成函数原型97) /ZI:生成程序库文件(Pdb)并支持Edit and Continue调试特性98) /Zi:生成程序库文件(pdb),包含类型信息和符号调试信息99) /ZL:从obj文件里去掉缺省的库文件名100) /Zm:设置编译器的内存分配xianzhi101) /Zn:禁止浏览信息文件里面的封装102) /Zp:设置结构成员在内存里面的封装格式103) /Zs:快速检查语法错误--------------------------vc所支持的文件类型1) DSW:全称是Developer Studio Workspace,最高级别的配置文件,记录了整个工作空间的配置信息,她是一个纯文本的文件,在vc创建新项目的时候自动生成2) DSP:全称是Developer Studio Project,也是一个配置文件,不过她记录的是一个项目的所有配置信息,纯文本文件3) OPT:与DSW、DSP配合使用的配置文件,她记录了与机器硬件有关的信息,同一个项目在不同的机器上的opt文件内容是不同的4) CL W:记录了跟ClassWizard相关的信息,如果丢失了clw文件,那么在Class View面板里就没有类信息5) PLG:实际上是一个超文本文件,可以用Internet Explorer打开,记录了Build的过程,是一个日志型文件6) RC:资源描述文件,记录了所有的资源信息,在资源编辑器里作的修改,实际上都是对RC文件的修改7) RC2:附加的资源描述文件,不能直接资源编辑器修改,只能手工添加,可以用来添加额外的资源8) RES:经过资源编辑器编译之后的资源文件,以二进制方式存放9) SBR:编译器生成的浏览信息文件,在代码导航的时候非常有用,她需要在编译时指定/FR或者/Fr开关10) BSC:BSCMAKE.EXE将所有的SBR文件作为输入,经过处理之后输出一个BSC文件,在代码导航的时候实际用到的是BSC 文件11) ILK:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信息12) PDB:全称是Program DataBase,即程序数据库文件,用来记录调试信息,是一个相当重要的文件,没有他,程序无法正常调试13) LIB:如果项目输出是Dll的话,一般会输出一个跟项目同名的Lib文件,记录输出的函数信息14) EXP:同Lib,是跟Dll一起生成的输出文件15) PCH:全称是PreCompiled Header,就是预先编译好的头文件,在编译时指定/Y u开关时编译器自动生成VC++编译器中一些常见precompiling 指令介绍我们在利用vc6.0 project wizard生成的代码中,经常看到大量的precompiling指令。
C++关键字及说明解释
C++关键词asmautobad_castbad_typeidboolbreakcasecatchcharclassconstconst_castcontinuedefaultdeletedodoubledynamic_cast elseenumexcept explicit externfalsefinallyfloatforfriendgotoifinlineintlongmutable namespaceoperator private protected publicregister reinterpret_cast returnshortsignedsizeofstaticstatic_caststructswitch templatethistruetrytype_infotypedeftypeid typename unionunsignedusingvirtualvoidvolatilewchar_t whileasm已经被__asm替代了,用于汇编语言嵌入在C/C++程序里编程,从而在某些方面优化代码.虽然用asm关键词编译时编译器不会报错,但是asm模块的代码是没有意义的.(2)auto这个这个关键词用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。
这个关键词不怎么多写,因为所有的变量默认就是auto的。
(3)bad_cast,const_cast,dynamic_cast,reinterpret_cast,static_cast关于异常处理的,还不是太了解..(4)bad_typeid也是用于异常处理的,当typeid操作符的操作数typeid为Null指针时抛出.(5)bool不用多说了吧,声明布尔类型的变量或函数.(6)break跳出当前循环.The break statement terminates the execution of the nearest enclosing loop or conditional statement in which it appears.(7)caseswitch语句分支.Labels that appear after the case keyword cannot also appear outside a switch statement.(8)catch,throw,try都是异常处理的语句,The try, throw, and catch statements implement exception handling.(9)char声明字符型变量或函数.(10)class声明或定义类或者类的对象.The class keyword declares a class type or defines an object of a class type.(11)const被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
C++类中的各种成员,嵌套类,友元,this指针专题
类中的各种成员
const ,static,[],*p,const static,对象成员,常量对象,mutable 1.类中的静态成员变量 static:被类中的所有对象所共享,静态成员属于整个类不属于某个对象。静态成员变量和全局 变量差不多,只是他的作用范围为定义他的类及类的对象所知。 1.1.当在一个类中声明静态成员变量时并没有定义该变量即没有为他分配存储空间,所以必须在类外对静态成员变 量提供全局定义,注意必须在类外,这样就可以为变量分配内存,定义的方式为使用作用域解析符,比如有类 hyong 类中有静态整型成员 a,那么在类外定义该变量的方式为 int hyong::a=9;注意必须要有在类中声明的类型, 如果定义时没有初始化则自动初始化为 0。 1.2.静态成员变量如果是类中的公有成员则可以在程序中使用语句 hyong::a 来访问该变量,当然也可以通过对象名 来访问该变量,如果变量是私有或者保护的,则只能用静态的成员函数来访问该变量。 1.3 不能用初始化列表来初始化静态成员变量。 2.静态成员函数 static,静态成员函数没有 this 指针,静态成员函数只能引用这个类的其他类静态成员,当然全局函数 和数据可以访问,因为类的函数都要用 this 指针来访问成员,因为静态成员函数没有 this 指针,所以不能访问除静态 成员之外的成员。同一个函数不可以有静态和非静态两种版本,静态成员函数不可以是虚函数,静态成员函数不能是 const 和 volatile。静态成员函数使用是有限的,通常使用静态成员函数来访问类中的私有静态成员变量。在类外定义 的形式为 int hyong::g(){}注意,这里没有 static 说明符。 3.const 成员变量参看第四节初始化列表。 4.const 成员函数,形式为 int f() const{}注意 const 在括号后,如果把 const 放在 int 前就成为一个反回 const int 类型的函 数了, 把函数声明为 const 后就使得 this 可以当做一个 const 指针, 从而使得函数不能修改调用它的对象也就是说不能 改变任何一个类的成员变量的值。如果想让 const 函数能修改某一部分成员,可以把该成员声明为 mutable 类型,例 如 mutable int a。在类外定义的形式为 int hyong::f() const{} 5.const static 常量静态数据成员,这种类型的成员变量可以直接在类的定义中直接初始化,这也是唯一一种可以在类 中初始化的类型,如果没有在类中初始化,在类外的初始化方式为 const int hyong::a=2;注意 const 和类型都必须有。 6.const 常量对象:即把对象声明为常量,即 const hyong m,常量对象不能调用可能改变对象的值的函数,因此常量对 象只能调用类中的 const 常量函数,因为不是 const 的函数都有可能改变对象的值。 6.2.常量对象可以调用类中的公有成员,如 m.a 就是正确的如果 a 是公有的。 6.4.不能对常量对象的公有成员重新赋值,如 m.a=3 就是错误的。但可以对类中的公有静态成员变量重新赋值,因 为静态成员变是不属于这个常量对象,他是属于整个类的。 7.对象数组:对象数组即数组中的每个成员都是一个对象,例如 hyong a[3];其中 a[0],a[1],a[2]都是一个 hyong 类型的 对象。对象数组的初始化,如果有默认构造函数则语句 hyong a[3]将调用默认构造函数初始化 3 个对象,如果对象数
VC++常用功能详解
常用功能代码目录在View中如何得到Doc中的数据?在Doc中如何通知相关的View更新显示?在Doc中如何得到与它相关的视图Views?怎样得到应用程序类?怎样得到应用程序的主框架类Frame?怎样在自定义类中得到当前视图View类?怎样在框架类中得到当前文档Doc类?怎样在自定义类中得到当前文档Doc类?获取所有菜单项的数目。
设置菜单的风格。
SDI单文档状态栏编程VC++头文件的包含顺序问题。
几种DC之间的区别在绘图之前擦除屏幕CSocket类网络通信编程步骤在View中如何得到Doc中的数据?在Doc中如何通知相关的View更新显示?在Doc中如何得到与它相关的视图Views?怎样得到应用程序类?怎样得到应用程序的主框架类Frame?怎样在自定义类中得到当前视图View类?怎样在框架类中得到当前文档Doc类?怎样在自定义类中得到当前文档Doc类?获取所有菜单项的数目。
设置菜单的风格。
SDI单文档状态栏编程VC++头文件的包含顺序问题。
几种DC之间的区别在绘图之前擦除屏幕CSocket类网络通信编程步骤在View中如何得到Doc中的数据?为了显示和修改文档类的数据,在CView类中有一指向相应文档类对象的指针变量m_pDocument。
m_pDocument在CView中被说明为指向CDocument类的指针,而在具体的应用中文档类一般都是CDocument类的派生类,必须对m_pDocument指针进行强制类型转换才能利用它检索CDocument派生类的特有数据。
为此AppWizard在CView的派生类中专门生成了一成员函数GetDocument()来完成这一转换。
但是按照C++的编程风格,一个类中的数据要尽量使用private型,同时给出两个访问的成员函数Get()和Set()。
这样得到数据就要用如下形式:在Doc中如何通知相关的View更新显示?在CDocument的派生类中调用以下语句:在Doc中如何得到与它相关的视图Views?在CDocument的派生类中,要得到与它相关的用于显示的视图可调用以下语句:怎样得到应用程序类?怎样得到应用程序的主框架类Frame?在任何地方可使用以下形式得到:怎样在自定义类中得到当前视图View类?程序中往往有程序员自已增加的类,例如用户生成的一个对话框类。
c++this指针的用法
c++this指针的用法
this指针是每个对象都隐含着的,一个指向对象本身的指针,因为对象本身在函数中作为参数传入,有this指针就可以更好的处理类的函数。
C++中this指针的用法有以下几种:
1、在成员函数中访问成员变量:在成员函数中,如果我们使用this指针,则可以避免因局部变量名和成员变量名重复而引起的错误。
2、在成员函数中传递指向自身的指针:我们使用this指针即可传递一个指向自身的指针,这个指针可以在其它的函数中被使用。
3、用在静态成员函数中:当静态成员函数被调用时,this指针不会自动生成,因此我们只能在静态成员函数中使用this指针。
4、在调用友元函数是使用:由于友元函数不属于任何类,因此无法自动获得this 指针,此时,如果我们需要使用this指针,可以通过显示地将this指针作为参数传递给友元函数。
qpainter用法
qpainter用法QPainter是Qt框架中的一个2D绘图引擎,它提供了一些基本的绘图功能,如画线、画圆、填充颜色等。
在Qt中,我们可以使用QPinter来制作自己的绘图控件或者在窗口中添加自定义的图形。
一、QPainter的创建和基本设置1. 创建一个QPainter对象我们可以通过QWidget类的paintEvent()方法来创建一个QPinter 对象。
```cppvoid Widget::paintEvent(QPaintEvent *event){QPainter painter(this);}```其中this指针代表当前窗口部件。
2. 设置画笔和画刷在使用QPainter之前,我们需要先设置画笔和画刷。
画笔用于描边,而画刷用于填充颜色。
我们可以使用QPen和QBrush类来设置画笔和画刷。
以下是设置黑色实线边框和白色填充颜色的示例代码:```cppQPen pen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap,Qt::RoundJoin);QBrush brush(Qt::white);painter.setPen(pen);painter.setBrush(brush);```其中,第一个参数为颜色,第二个参数为宽度,第三个参数为线条风格(实线、虚线等),第四个参数为端点样式(圆头、方头等),第五个参数为连接处样式(圆角、斜角等)。
3. 设置字体在绘制文本时,我们需要设置字体。
我们可以使用QFont类来设置字体,以下是一个设置宋体12号字体的示例代码:```cppQFont font("宋体", 12);painter.setFont(font);```二、QPainter的基本绘图操作1. 绘制直线我们可以使用drawLine()方法来绘制直线。
以下是从(0,0)到(100,100)的直线的示例代码:```cpppainter.drawLine(0, 0, 100, 100);```2. 绘制矩形我们可以使用drawRect()方法来绘制矩形。
c中this的用法和意义
c中this的用法和意义一、this指针的概念和作用在C++中,this是一个特殊的指针,它指向当前对象的地址。
this指针可以访问当前对象的成员变量和成员函数,主要用于区分同名变量和实现对象之间的交互。
1.1 this指针的定义在类内部,不管是成员函数还是成员变量,都可以通过使用this来访问当前对象。
this指针被隐式地传递给每一个非静态成员函数,并且具有const属性。
1.2 用法举例下面通过一个简单的代码示例来展示this指针的用法:```cpp#include <iostream>using namespace std;class Person {public:void setName(string name) {this->name = name;}string getName() {return this->name;}private:string name;};int main() {Person p;p.setName("John");cout << "Name: " << p.getName() << endl;return 0;}```本示例中,Person类包含了一个私有成员变量name,并提供了setName和getName两个公有成员函数。
在setName函数中,通过使用this指针来设置对象的name属性;同样,在getName函数中,通过使用this指针返回当前对象的name属性值。
此时运行程序,输出结果为:```Name: John```从这个简单示例中可以看出,在成员函数内部使用this指针可以准确地访问当前对象的成员变量。
二、this指针的意义和重要性2.1 区分同名变量在某些情况下,类的成员变量和局部变量可能具有相同的名称,此时可以通过使用this指针来准确定位到类成员。
this指针及用法 -回复
this指针及用法-回复this指针是C++中的一个关键字,它包含了指向当前对象的指针。
使用this指针,我们可以在成员函数中访问当前对象的成员变量和成员函数。
在本文中,我们将逐步回答有关this指针的用法和功能。
一、理解this指针的概念在面向对象的编程中,this指针是一个隐含的参数,它指向当前对象的地址。
当一个对象调用成员函数时,编译器会将this指针作为隐含参数传递给函数。
通过this指针,我们可以在成员函数中访问对象的成员。
二、this指针的用途1. 在成员函数中访问成员变量:通过this指针,我们可以在成员函数中访问当前对象的成员变量。
这对于解决成员变量与局部变量同名的问题非常有用,可以明确地指定访问的是成员变量还是局部变量。
例如:cppclass MyClass {private:int num;public:void setNum(int num) {this->num = num; 使用this指针访问成员变量}};2. 在成员函数中调用其他成员函数:通过this指针,我们可以在成员函数中调用其他成员函数。
这对于对象内部的函数调用非常方便,可以减少代码冗余。
例如:cppclass MyClass {public:void function1() {do something}void function2() {this->function1(); 使用this指针调用其他成员函数}};3. 返回当前对象的引用:在一些情况下,我们希望在成员函数中返回当前对象的引用。
通过this指针,我们可以轻松实现这一功能。
例如:cppclass MyClass {private:int num;public:MyClass(int num) {this->num = num;}MyClass& addNum(int value) {this->num += value; 修改成员变量return *this; 返回当前对象的引用}};三、this指针的局限性this指针虽然非常有用,但也有一些局限性需要注意。
this,super关键字
this和super 和
• private String strain;//品种在子类中使用 在子类中使用this的前提就是 在子类中使用 的前提就是 父类中存在无参构造。 父类中存在无参构造。 • public Dog(String strain){this();父类必须存在无参 父类必须存在无参 • this.strain=strain;} • public Dog(String name1,String strain){ • super(name1);显式调用父类有参 显式调用父类有参 • this.strain=strain; } • public Dog(){ } • 如果子类的构造函数中没有通过 子类的构造函数中没有通过super显式调用父类的有 子类的构造函数中没有通过 显式调用父类的有 参构造方法,则系统默认会调用父类的无参构造方法 系统默认会调用父类的无参构造方法。 参构造方法 系统默认会调用父类的无参构造方法 this(),super()不能用于同一个构造 不能用于同一个构造因为他们都要位于构造 不能用于同一个构造 的第一条语句.
this和static的区别 和 的区别
• static修饰 修饰的属性和方法称为类属性 类变 类属性(类变 修饰 类属性 类方法.不用static修饰的属性和方法 量)和类方法 类方法 称为实例属性 实例变量 实例方法 实例属性(实例变量 实例方法。 实例属性 实例变量),实例方法 • this指的是当前实例【不能使用类方法中】。 当前实例【 当前实例 不能使用类方法中】 • 由于静态成员函数存在于类一级 静态成员函数存在于类一级,并且不 静态成员函数存在于类一级 是对象的一部分,因此没有 this 指针。在 没有 指针 静态方法中引用 this 是错误的。
C++面向对象程序设计实验三 类和对象
学长只能帮你到这了
要想学习好,努力少不了
int y; }; void main() { CPoint p; p.print(); CPoint p1(1,2); //构造函数不能显示调用 p1.print(); //即 CPoint p1;p1.CPoint(1,2); CPoint p2=p1; //运行时会出错。 p2.print(); }
学长只能帮你到这了
要想学习好,努力少不了
{ CPoint pt; pt.Set(10,20); pt.Print(); }
问题一:以上程序编译能通过吗,试解释该程序? 答:可以通过, 问题二:以上程序的运行结构是否正确,如果不正确,试分析为什么,应该如何改正? 共有变量与私有变量名一样,调用的时候调用了私有变量,而私有变量没有值所以是
学长只能帮你到这了
要想学习好,努力少不了
ps.Print(); }
问题一:以上程序存在三处大错误,在不改变主函数内容的前提下,试改正该程序。 答:把成员函数都改成公有;函数的参数应该有数组或字符串的定义才可以传递“张三” 。 主函数中对构造函数的引用也有错。 class CPerson{ public: void Print(); CPerson(int ,char s[10]); private: int age; char *name; }; CPerson::CPerson(int a,char s[10]) { age=a; name=s; } void CPerson::Print() { cout<<"name="<<name<<",age="<<age<<endl; } void main() { CPerson ps(23,"张三"); ps.Print();
this指针及用法
this指针及用法this指针是C++语言中的一个关键字,用于指向当前对象。
它是一个隐含参数,即在成员函数内部使用时,编译器会自动将当前对象的地址传递给this指针。
this指针的主要作用是解决对象成员函数无法直接访问对象成员的问题,因为成员函数是独立于具体对象存在的,它没有自动访问对象成员的权限。
通过this 指针,我们可以在成员函数内部访问对象成员,并且可以在函数内部修改对象的状态。
this指针的用法如下:1. 返回对象自身:在某些情况下,我们希望在一个成员函数中返回对象自身,此时可以使用this 指针返回,例如:class MyClass {public:MyClass& func() {do somethingreturn *this;}};通过返回类型为类对象的引用,可以实现连续调用的效果,类似于链式调用。
2. 在成员函数中访问对象成员:在成员函数中,我们可以通过this指针来访问对象的成员变量和成员函数,例如:class MyClass {private:int x;public:void setX(int value) {this->x = value;}};在成员函数`setX`中,通过this指针可以访问到对象的成员变量`x`,并给它赋新的值。
3. 传递this指针给其他函数:成员函数可以调用其他函数,如果需要在函数调用时传递当前对象的引用,可以使用this指针,例如:class MyClass {public:void func() {otherFunc(this);}void otherFunc(MyClass* obj) {do something}};在成员函数`func`中,通过调用`otherFunc`函数并传递this指针,可以让`otherFunc`函数获取到当前对象的引用。
4. 解决参数命名冲突:当成员变量和函数参数同名时,可以使用this指针来区分,以明确指向成员变量。
c++ this的用法
c++ this的用法在C语言中,this是一个关键字,用于指向当前对象的指针。
在面向对象编程中,this通常用于解决对象引用的传递问题。
在C语言中实现面向对象编程并不是一件容易的事情,但是可以通过一些技巧来实现类似的功能。
首先,我们需要了解this的使用场景。
通常,this用于指向当前对象的指针,以便在成员函数中访问该对象的成员变量和成员函数。
通过使用this指针,我们可以避免在成员函数中传递对象指针的繁琐过程,从而提高代码的可读性和可维护性。
接下来,我们来看一下this的关键字用法。
在C语言中,可以使用指向对象的指针来访问其成员变量和成员函数。
在成员函数中,可以使用以下语句来声明和初始化this指针:```c对象* this;```需要注意的是,this指针是一个指向对象的指针,而不是一个局部指针。
因此,它不能被传递给其他函数或作为参数传递给函数调用。
相反,它应该在成员函数内部声明和初始化。
在使用this指针时,我们需要注意指针的类型和指向的对象类型。
确保this指针的类型与对象类型匹配,否则可能会导致未定义的行为。
另外,this指针只在该成员函数的作用范围内有效,不能在全局范围内使用。
下面是一个简单的示例程序,演示了this的使用方法:```c#include <stdio.h>class MyClass {public:int value;MyClass(int v) : value(v) {}void setValue(int v) { value = v; }};int main() {MyClass obj(10);obj.setValue(20);printf("Value: %d\n", obj.value); // 输出:Value: 20 return 0;}```在上面的程序中,我们定义了一个MyClass类,包含一个成员变量value和一个成员函数setValue()。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void show() { cout<<x<<y<<endl; } 却没有问题, 后来发现这是个变量的有效范围(作用域的问题) 显然, 类的成员变量在类的成员函数中是可见的, 所有的类方法都将 this 指针设 置为调用他的对象的地址 在 void show() 函数中 x 和 y 其实是 this->x 和 this->y 的简写。 但是在 void set(int x,int y)中 x=x; y=y;都是参数变量在其作用任何 x 或者 y 都不是 this->x 或者 this->y 的简写,因 为参数变量和成员变量同名,在 void set(int x,int y) 就隐含(屏蔽)了成员变量 好比是: main.cpp: int i=5; void set(int i); int main() { int n = 3; set(n); return 0; } void { i=i;//显然不能对全局变量赋值成功,局部变量"屏蔽"了全局变量//要 用::i=i cout<<i<<endl;//要数据全局变量的话也要 cout<<::i<<endl; } 同样的如果想赋值成的话必须标记使用的是哪个变量 void set(int x,int y) set(int i)
在书中对于 this 指针的说明:对于每个成员函数(包括构造函数和析构函数)都有 一个 this 指针。this 指针指向的是调用该函数的对象,如果方法需要应用整个 调用对象。可以使用表达式*this,在函数的括号后面使用 const 限定符将 this 限 定为 const,这样将不能使用 this 指针来修改对象的值。 所以在创建线程的时候,可以传递 this 指针来传递整个调用对象。 #include<iostream> #include<string.h> using namespace std; class CTest { public: int x; int y; CTest() {x=1;y=1;}
using namespace std; class student{ private: char *name; int id; public: student(char *pName="no name",int ssId=0) { id=ssId; name=new char[strlen(pName)+1]; strcpy(name,pName); cout<<"construct new student "<<pName<<endl; } void copy(student &s) { if (this==&s) { cout<<"Erro:can't copy one to oneself!"<<endl; return; }else { name=new char[strlen()+1]; strcpy(name,); id=s.id; cout<<"the function is deposed!"<<endl; } } void disp() { cout<<"Name:"<<name<<" Id:"<<id<<endl; } ~student() {
C++中 this 指针的用法
this 指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是 一个例子: void Date::setMonth( int mn ) { month = mn; // 这三句是等价的 this->month = mn; (*this).month = mn; } 1. this 只能在成员函数中使用。 全局函数,静态函数都不能使用 this。 实际上,成员函数默认第一个参数为 T* const register this。 如: class A{public: int func(int p){}}; 其中,func 的原型在编译器看来应该是: int func(A* const register this, int p); 2. 由此可见,this 在成员函数的开始前构造的,在成员的结束后清除。 这个生命周期同任一个函数的参数是一样的,没有任何区别。 当调用一个类的成员函数时, 编译器将类的指针作为函数的 this 参数传递进 去。如: A a; a.func(10); 此处,编译器将会编译成: A::func(&a, 10); 嗯,看起来和静态函数没差别,对吗?不过,区别还是有的。编译器通常会 对 this 指针做一些优化的,因此,this 指针的传递效率比较高--如 vc 通常是 通过 ecx 寄存器来传递 this 参数。 3. 回答 #1:this 指针是什么时候创建的? this 在成员函数的开始执行前构造的,在成员的执行结束后清除。 #2:this 指针存放在何处? 堆,栈,全局变量,还是其他? this 指针会因编译器不同,而放置的位置不同。可能是栈,也可能是寄存器, 甚至全局变量。
#3:this 指针如何传递给类中函数的?绑定?还是在函数参数的首参数就是 this 指针.那么 this 指针又是如何找到类实例后函数的? this 是通过函数参数的首参数来传递的。this 指针是在调用之前生成的。类 实例后的函数,没有这个说法。类在实例化时,只分配类中的变量空间,并没有 为函数分配空间。自从类的函数定义完成后,它就在那儿,不会跑的。 #4:this 指针如何访问类中变量的/? 如果不是类,而是结构的话,那么,如何通过结构指针来访问结构中的变量 呢?如果你明白这一点的话,那就很好理解这个问题了。 在 C++中,类和结构是只有一个区别的:类的成员默认是 private,而结构 是 public。 this 是类的指针,如果换成结构,那 this 就是结构的指针了。 #5:我们只有获得一个对象后,才能通过对象使用 this 指针,如果我们知道一个 对象 this 指针的位置可以直接使用吗? this 指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通 过对象使用 this 指针。所以,我们也无法知道一个对象的 this 指针的位置(只 有在成员函数里才有 this 指针的位置) 。 当然, 在成员函数里, 你是可以知道 this 指针的位置的(可以&this 获得),也可以直接使用的。 #6:每个类编译后,是否创建一个类中函数表保存函数指针,以便用来调用函 数? 普通的类函数(不论是成员函数,还是静态函数) ,都不会创建一个函数表 来保存函数指针的。只有虚函数才会被放到函数表中。但是,既使是虚函数, 如 果编译器能明确知道调用的是哪个函数, 编译器就不会通过函数表中的指针来间 接调用, 而是会直接调用该函数。 # 7:这些编译器如何做到的?8:能否模拟实现? 知道原理后,这两个问题就很容易理解了。 其实,模拟实现 this 的调用,在很多场合下,很多人都做过。 例如,系统回调函数。系统回调函数有很多,如定时,线程啊什么的。 举一个线程的例子: class A{ int n; public: static void run(void* pThis){ A* this_ = (A*)pThis; this_->process(); }
void process(){} }; main(){ A a; _beginthread( A::run, 0, &a ); } 这里就是定义一个静态函数来模拟成员函数。 也有许多 C 语言写的程序,模拟了类的实现。如 freetype 库等等。 其实,有用过 C 语言的人,大多都模拟过。只是当时没有明确的概念罢了。 如: typedef struct student{ int age; int no; int scores; }Student; void initStudent(Student* pstudent); void addScore(Student* pstudent, int score); ... 如果你把 pstudent 改成 this,那就一样了。 它相当于: class Student{ public: int age; int no; int scores; void initStudent(); void addScore(int score); } const 常量可以有物理存放的空间,因此是可以取地址的 ///this 指针是在创建对象前创建. this 指针放在栈上,在编译时刻已经确定. 并且当一个对象创建后,并且运行整个程序运行期间只有一个 this 指针. 问题的提出:编写程序实现对象资源的拷贝(要求使用 this 指针) 。 #include <iostream> #include <string>
{ this->x = x; this->y = y; } 总之就是变量的作用域在作怪
~CTest() {} void show() { cout<<x<<endl<<y<<endl; } void set(int x,int y)//void set(int a x,int b) { x = x; y = y; } //{ // x=a;
// y=b; //}
};
int main() { CTest ctest; ctest.show(); ctest.set(5,8); ctest.show(); return 0; } 输出的结果是 1 1 1 1 我开始有点怀疑这是为什么 void set(int x,int y) { x = x; y ;<"Destruct "<<name<<endl; delete name; }