【C++】各种成员变量

来自:黄邦勇帅

const 常量对象:

  即把对象声明为常量,即 const hyong m,常量对象不能调用可能改变对象的值的函数,因此常量对象只能调用类中的 const 常量函数,因为不是 const 的函数都有可能改变对象的值。

  常量对象可以调用类中的公有成员,如 m.a 就是正确的如果 a 是公有的。

  不能对常量对象的公有成员重新赋值,如 m.a=3 就是错误的。但可以对类中的公有静态成员变量重新赋值,因为静态成员变是不属于这个常量对象,他是属于整个类的。

对象数组:

  对象数组即数组中的每个成员都是一个对象,例如 hyong a[3];其中 a[0],a[1],a[2]都是一个 hyong 类型的对象。

  对象数组的初始化,如果有默认构造函数则语句 hyong a[3]将调用默认构造函数初始化 3 个对象;

  如果对象数组带有一个参数的构造函数则可以这样初始化 hyong a[3]={1,2,3};

  如果对象数组带有多个参数的构造函数,则初始化方法为 hyong a[3]={hyong(1,2),hyong(3,4),hyong(4,5)}。

类中的对象成员:

  即把对象作为另一个类的成员。比如 class B{public: A x;}

  如果要用带参数的构造函数初始化x, 必须用初始化列表初始化

例子:

#include <iostream>
using namespace std;

class A
{
public:
    int a, b;
    A()
    {
        a = b = 0;
        cout << "A 默认构造函数" << endl;
    }
    A(int i)
    {
        a = b = i;
        cout << "A 一个参数的构造函数" << endl;
    }
    A(int i, int j)
    {
        a = i;
        b = j;
        cout << "A 两个参数的构造函数" << endl;
    }
};

class B
{
public:
    int a, b;
    A x;
    B()
    {
        a = b = 2;
        cout << "B 默认构造函数" << endl;
    }
    B(int i)
    {
        a = b = i;
        cout << "B 一个参数的构造函数" << endl;
    }
    B(int i, int j);
};

B::B(int i, int j):a(i), b(j), x(A(3,4)){} //用含参数的构造函数初始化成员,用初始化列表

int main()
{
    A m;
    cout << "---------------" << endl;
    B n;
    cout << "---------------" << endl;
    B n1(4, 5);
    cout << "---------------" << endl;
    n.x = A(6, 7);
    cout << "---------------" << endl;
    cout << n.x.a << n.x.b << endl;

    return 0;
}

如果不用初始化列表,在构造函数里用两个变量的构造函数给x赋值,结果是

#include <iostream>
using namespace std;

class A
{
public:
    int a, b;
    A()
    {
        a = b = 0;
        cout << "A 默认构造函数" << endl;
    }
    A(int i, int j)
    {
        a = i;
        b = j;
        cout << "A 两个参数的构造函数" << endl;
    }
};

class B
{
public:
    int a, b;
    A x;
    B()
    {
        a = b = 2;
        x = A(1,2);  //这里已经不是初始化了。而是重新赋值。
                     //先用A的默认构造函数生成了x, 这里又用A(1,2)构造了一个临时变量,通过赋值函数将临时变量赋给了x
        cout << "B 默认构造函数" << endl;
    }
};

int main()
{
    B n;
    return 0;
}

类成员指针

  1.声明类成员指针的方式为:int hyong::*p1 声明了一个指向类中整型成员的指针 p1。 int (hyong::*p2)()注意括号,声明一个指向反回类型为 int 的无参数的函数的指针 p2

  2.类成员指针即指向类中成员的指针注意是直接指向类中的成员而不是指向对象的某一成员的指针, 即与指针 p=&m.a是不一样的。

    类成员指针提供的是成员在类中的对象的偏移量,不是一个真正的指针。

    因为不是一个真正的指针所以不能通过指针来访问类中的成员,而只能通过特殊的运算符.*或->*来访问指针指向的成员。

    比如*p1=2 ,hyong::*p1=2 是错误的,不能对类成员指针指向的类成员直接赋值。cout<<*p1<<hyong::*p1 也是错误的,不能直接用类成员指针来访问类中的成员。

时间: 2024-10-01 07:20:13

【C++】各种成员变量的相关文章

Java的成员变量初始化

对于方法里面的成员变量,Java要求程序员强制提供一个初始化的值.比如下面这个方法就会出错: public class Breakyizhan{ public void Z(){ int z; z++; } public static void main(String[] args) { Breakyizhan B = new Breakyizhan(); B.Z(); } } /* (www.breakyizhan.com) 输出结果是: 编译会出错,方法变量没有初始化 */ 而对于类的数据,

Delegate成员变量和Event的区别

上周五有同事问了我一个问题:Delegate和Event有什么区别?具体来说在设计一个类的时候,声明一个事件(Event)和声明一个Delegate类型的成员变量有啥区别. 我的第一反应是没啥区别,虽然从语法看起来不一样,但从代码希望达成的效果来看是一致的,本质都是回调函数.当然区别是肯定有的,我能给我的理由是两个:首先从与COM交互操作时,event对应COM接口中的事件:其次VS的编译环境对定义event提供了更加便捷的支持,可以为其自动生成回调函数的框架. 翻了翻MSDN,并没有直接描述两

C# 字段、属性、成员变量 [转载]

一.定义与作用 1.字段(field):是C#类级别定义的,和方法同一级别. 一般用来类内部进行访问,充当一种类中的"全局变量"角色:或者配合属性来使用 2.属性:同样是C#类级别定义的,一般是供外部类访问的. 3.成员变量:"全局变量",在类中定义的变量,区别于在方法中定义的局部变量.它与字段属性不是同一级别概念,字段,属性都可以叫做成员变量. 二.使用 class Basic { private string FieldVar;//这是字段,在当前类中调用 pr

Java接口里定义成员变量 说明

首先你要弄清接口的含义.接口就是提供一种统一的'协议',而接口中的属性也属于'协议'中的成员.它们是公共的,静态的,最终的常量.相当于全局常量. 在interface里面的变量都是public static final 的.所以你可以这样写: public static final int i=10; 或则 int i=10;(可以省略掉一部分,在接口里的成员变量默认就是public static final) 注意在声明的时候要给变量赋予初值 解释: 首先你要弄清接口的含义.接口就是提供一种统

成员变量的定义与使用

成员变量又称为成员属性,它是描述对象状态的数据,是类中很重要的组成成分.本节详细讨论如何来定义成员变量.成员变量的访问权限,以及静态成员变量与实例成员变量之间的区别. 成员变量的定义 定义成员变量的语法如下:[变量修饰符] 类型说明符变量名类的成员变量和在方法中所声明的局部变量都是用户标识符,它们的命名规则相同.变量修饰符是可选项,一个没有变量修饰符的变量定义如下: public class Cuber{ double width,height; int number; } 成员变量的类型可以是

C++ 成员变量是别的类的对象

?在成员函数中,可以将this指针当参数传递,也可以返回this指针,或返回通过this指针拿到的对象 /* 成员变量是别的类的对象 */ #include <iostream> using namespace std; //日期类 class Date { int year,month,day; public: //构造方法 Date(){ cout << "Date() " << endl; } //有参 Date(int _y,int _m,i

《coredump问题原理探究》Linux x86版6.3节有成员变量的类coredump例子

在探究完类成员变量分布后,来定位一个coredump例子来实践一把: (gdb) bt #0 0x0804863c in xuzhina_dump_c06_s2_ex::print() () #1 0x08048713 in main () 看一下xuzhina_dump_c06_s2_ex::print的汇编: (gdb) disassemble 0x0804863c Dump of assembler code for function _ZN22xuzhina_dump_c06_s2_ex

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

成员变量和局部变量的区别

1)位置不同: 成员变量:类中方法外. 局部变量:在方法定义上或者方法定义中. 2)在内存中位置不同: 成员变量:在堆内存. 局部变量:在栈内存. 3)生命周期不同: 成员变量:随类的加载而加载,随类的对象消失而消失. 局部变量:随着方法的调用而存在,随着方法调用完毕而消失. 4)初始化值不同: 成员变量:有默认的初始化值,系统根据该成员变量的类型来给默认值. 局部变量:必须有初始化值或者是在使用这个局部变量之前而赋值,没有默认初始化值. 注意:当局部变量和成员变量名称一致,就近原则输出变量的值

面向对象,局部变量和成员变量

面向对象的编程关注与类的设计设计类实际上是设计类的成员基本的类的成员,属性(成员变量)&方法1.设计类,并设计类的成员(成员变量&成员方法)2.通过类,来创建类 的对象(累的实例化用new)3.通过“对象.属性”或“对象.方法”来调用,来完成相应的功能二.创建多个对象,彼此各自拥有一套类的属性.当对其中一个对象的属性进行修改是,不会影响其他对象的属性值三.类的属性(成员变量)成员变量vs局部变量相同点:1.遵循变量声明的格式:修饰符 数据类型 变量名=初始化值 2.都有作用范围不同点:1.