C/C++中的常成员函数】的更多相关文章

代码: #include <iostream> using namespace std; class A{ public: void func1(){ cout<<"func1"<<endl; } void func1()const{ cout<<"const func1"<<endl; } void func2()const{ cout<<"const func2"<…
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zhuyingqingfen/article/details/31751111 先明白几个概念: 1. 常对象仅仅能调用常成员函数. 2. 普通对象能够调用所有成员函数. 3. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数.每次成员函数存取数据成员时,由隐含使用this指针.4. 当一个成员函数被调用时,自己主动向它传递一个隐含的參数.该參数是一个指向这个成员…
关于C++中,类的常成员函数 声明样式为:   返回类型 <类标识符::>函数名称(参数表) const 一些说明: 1.const是函数声明的一部分,在函数的实现部分也需要加上const 2.const关键字可以重载函数名相同但是未加const关键字的函数 3.常成员函数不能用来更新类的成员变量,也不能调用类中未用const修饰的成员函数,只能调用常成员函数.即常成员函数不能更改类中的成员状态,这与const语义相符. 例一:说明const可以重载函数,并且实现部分也需要加const #in…
常量:对于既需要共享.又需要防止改变的数据.在程序运行期间不可改变. const 修饰的是对象中的 this 指针.所以不能被修改. 1.常对象 数据成员值在对象的整个生存期内不能改变.在定义时必须初始化,而且不能被更新. 常对象,只能调用常成员函数,保证常对象的数据成员不被改变. class point { public: point(int i, int j) { x = i, y = j; } private: int x, y; }; // 定义常对象 point , ); // 定义时…
转:http://c.biancheng.net/view/2230.html 在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只需要在声明时加上 const 关键字.初始化 const 成员变量只有一种方法,就是通过构造函数的初始化列表,这点在前面已经讲到了,请猛击<C++初始化列表>回顾. const成员函数(常成员函数) const 成员函…
在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只需要在声明时加上 const 关键字.初始化 const 成员变量只有一种方法,就是通过构造函数的初始化列表,这点在前面已经讲到了,请猛击<C++初始化列表>回顾. const成员函数(常成员函数) const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值,这种措施主要还是为了保护数据…
在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static ! 在C语言中,我们使用pthread_create创建线程,线程函数是一个全局函数,所以在C++中,创建线程时,也应该使用一个全局函数.static定义的类的成员函数就是一个全局函数. 更多 参考  http://blog.csdn.net/ksn13/article/details/40538083 #include <pthread.h> #…
让一个成员函数带上常量性是什么意思呢?通常的答案是,一个常成员函数不会更改其class对象.这是一种平凡的表述,而编译器实现的手法也相当平凡. 任何非静态成员函数其实都被编译器隐式插入了一个指针类型的参数,以在调用时有一种指向class对象自身的途径.在函数内部,关键字this被用于给出该指针的值: T t; t.DoSomething(); //“this”就是&t T* pt = &t; pt->DoSomething //“this”就是pt 对于T类型的非常成员函数而言,其t…
#include <iostream> using namespace std; class Test { public: int x; int y; void const_m1() const; void const_m2() const; void m3(); void m4(); }; /** * //1常成员函数不能修改成员变量的值 * //2常成员函数只能调用常成员函数,不能调用普通成员函数 * //3普通成员函数可以调用常成员函数 */ void Test::const_m1(vo…
C++的常成员函数与同名成员函数重载时,该如何显式调用常成员函数? 具体的一个小例子: #include <iostream> using namespace std; class C1 { public: void fun() { cout<<<<endl; } void fun() const { cout<<<<endl; } }; 可用如下方法调用常成员函数 void fun() const : C1 c1; ((const C1&…
http://blog.csdn.net/gmstart/article/details/7046140 在C++的类定义里面,可以看到类似下面的定义: 01 class List { 02 private: 03      Node * p_head; 04      int length; 05      …… 06 Public: 07      int GetLength () const; 08      bool GetNodeInfo(const int index,Node &…
常变量.常对象.常引用.指向常对象或常变量的指针等在定义时都使用了const关键字,这是C++语言引入的一种数据保护机制,称为const数据保护机制.例如通过const关键字主动地将被调函数形参进行限定,限定被调函数不能修改主调函数传递过来的数据. 下面通过一个出租车类(Taxi),更好的理解常成员和常函数成员: class Taxi //定义出租车类 { private: int price; //出租车里程单价 int fare; //出租车收费总额 public: void SetPric…
转载于 http://www.cnblogs.com/graphics/archive/2010/07/05/1771110.html  http://hi.baidu.com/sdkinger/item/dcad78e374707ff12b09a453 一. #include <iostream> #include <map> #include <string> using namespace std ; int main(void) { map<int, st…
先看源码,在VS2010环境下无法编译通过,在VS2013环境下可以编译通过,并且可以运行,只是运行结果并不是我们期待的结果. 最初通过MyCircle类定义对象c1时,为对象分配内存空间,r没有初始化,其值为乱码,pi为3.1415926,area为乱码. [cin>>c1.r]这个语句为c1.r赋值,假设为10,然后执行[cout<<c1.area<<endl],我们来看,执行cout时是从内存空间中拿c1.area的值,这个值在定义对象时候已经确定是一个乱码值,此…
说明:流输入运算符,在一定程度上为C++程序的开发提供了很多便利,我们可以避免C语言那种繁琐的输入格式,比如在输入一个数值时,还需指定其格式,而cin以及cout则不需要.但是cin也有一些缺陷,比如当输入字符串时,遇到空格便截止,举个例子,如下,我们在输入“12 23.5 aa bb cc dd”,希望打印出的是前两个数值以及后面一个字符串“aa bb cc dd”,但实际打印出来的只有前两个数字和“aa”. #include <iostream> using namespace std;…
const 修饰的成员函数  表示  不会修改class中的成员变量. const 和 非-const 的成员函数同事存在时, 用户定义 const 类对象,调用 const 成员函数: 定义 非-const 类对象,调用  非-const 成员函数. 加上 const 的理由: 比如 string 中的[]重载,const string和string应该对应不同的操作. #include <iostream> class NN { public: NN() = default; //int…
一般而言,对于一个用户自定义的类类型,以下四个函数在用户没有自定义的情形下,会由编译器自动生成: 1.default constructor 2.copy constructor Someclass::Someclass(const Someclass &); 3.copy assignment operator Someclass & Someclass::operator=(const Someclass &); 4.destructor 对于C++11,又增加了两个: 5.m…
在C++中存在一个特殊函数,他就是复制构造函数,假如我们有类A,如果有A a;A b=a;   在这种情况下利用A类变量a来给同是A类变量的b来赋值,这个时候类会使用复制构造函数,如果我们不显式声明复制构造函数,那么类将会调用默认的复制构造函数.下面的代码说明了这一情况,如果我们将类StringBad中的复制构造函数StringBad(StringBad &)去掉,那么count最后输出的结果会为复制(count为静态变量用来记录类StringBad的对象个数). main.cpp #inclu…
string类的构造函数: string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 此外,string类还支持默认构造函数和复制构造函数,如string s1:string s2="hello":都是正确的写法.当构造的string太长而无法表达时会抛出length_error异常 string类的字符操作: const char &operator[](int n)const; const ch…
常对象 常对象必须在定义对象时就指定对象为常对象. 常对象中的数据成员为常变量且必须要有初始值,如 Time const t1(12,34,36); //定义t1为常对象 这样的话,在所有的场合中,对象t1中的所有数据成员的值都不能被修改.凡希望保证数据成员不被改变的对象,可以声明为常对象. 定义常对象的一般形式为 类名    const    对象名(实参列表); 也可以把const写在最左面 const    类名    对象名(实参列表); 二者等价 如果一个对象被声明为常对象,则不能调用…
在C++中内联成员函数与非内联成员函数的可以分为两种情况: 1.如果成员函数的声明和定义是在一起的,那么无论有没有写inline这个成员函数都是内联的,如下: using namespace std; class test{ public: void fuc() { cout << "ok!" << endl; } }; int main(void) { test t, t1; t.fuc(); t1.fuc(); return 0; } 或者: using n…
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果你曾经同过久的编译时间斗争过,那么你肯定对Pimpl("point to implementation",指向实现)机制很熟悉了.这种技术让你把类的数据成员替换成指向一个实现类(或结构)的指针,把曾经放在主类中的数据成员放到实现类中去,然后通过指针间接地访问那些数据成员.举个例子,假设Widget看起来像这个样子: class Wid…
线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程堆栈中static只是起了一个装饰的作用,所以二者并没有必然的关系 线程也是一种资源,是受系统调度的.因此,你必须要让系统知道你的线程的起始位置,即线程函数的指针.Window系统的接口(API)是C标准的,系统在启动线程时,需要直接得到线程的起始位置,因此你也必须向系统直接传递这样一个直接的函数指针,这与C++其它的…
//a.cpp class A{ public: int fun(int x){ ); } }; void tt() { } //b.cpp class A{ public: int fun(int x); }; void tt(); int yy() { tt(); A a; ); } 将它们分别编译后再链接:显示链接错误,因为b.cpp(b.o)中找不到A::fun(int)的引用. 将以上的a.cpp改为如下所示:class A{ public: int fun(int x); }; in…
c++ 类的成员函数放在类的外面来实现的写法,探究一下. 原文: http://www.cnblogs.com/findumars/p/6143375.html ------------------------------------------------------------------------ 在上篇文章<inline的另一用处>中,提到函数实现在类定义中与类定义外的区别. 现在先看个实验: a.cpp: #ifndef TEST_H #define TEST_H class A{…
http://no001.blog.51cto.com/1142339/389840/ mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中. 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的.但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,…
1.神奇的inline语法与语义 inline语义C99和C++98都有.之前在单源文件编写的时候一直没有发现问题,但是一考虑到多文件的链接,就发现矛盾了. 一些inline的原则: 1. inline 只是建议,不是写了 inline 编译器就一定会内联该函数.内联失败的原因有很多,识别方法也有不少,这里就不一一阐述. 2. 标准以及目标文件的本质就决定了真正的内联函数是不存在外部链接 external linkage 的,因此一般实现会要求要求 inline 的定义声明和使用一定要在同一个…
const 限定只读,对函数的实参进行保护 常数据成员:必须出现在类的定义体中,常数据成员必须进行初始化,并且不能被更新,但常数据成员的初始化只能通过构造函数的初始化列表进行 1. 常函数 成员函数加const 后我们称为这个函数为常函数 常函数内不可以修改成员属性 成员属性声明时加关键字 mutable 后,在常函数中依然可以修改 2. 常对象 声明对象前加 const 称该对象为常对象 常对象只能调用常函数,常对象只能调用它的成员函数,不能调用其他成员函数,只有常成员函数才有资格操作常量或常…
类所占内存的大小是由成员变量(静态变量除外)决定的,虚函数指针和虚基类指针也属于数据部分,成员函数是不计算在内的.因为在编译器处理后,成员变量和成员函数是分离的.成员函数还是以一般的函数一样的存在.a.fun()是通过fun(a.this)来调用的.所谓成员函数只是在名义上是类里的. 其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码.我们访问成员函数和普通函数一样会发生跳转产生入栈出栈的开销.所以这样也就增加了一定的时间开销,这也就是为什么我们提倡把一些简短的,调用频率高的函数…
在C++中,成员函数指针作为参数传递给其他函数和普通函数指针的传递是不同的,首先 我们来回顾一下普通函数指针的传递方法: //-------------------------------------------------------------------------- int fun1(int i){          return i; } void fun2(int j, int (*p)(int)){          cout << p(j); } void main() {  …