C++学习小记之类和属性--静态变量

初始化列表

作用:
C++提供了初始化列表的语法,用来初始化属性

语法:构造函数():属性1(值1),属性2(值2)...{}

#include <iostream>
using namespace std;

class Person
{
   
public:
    //传统的初始化操作
    //Person(int a,int b,int c)  
    //{
    //    my_A = a;
    //    my_B = b;
    //    my_C = c;
    //}
    //初始化列表初始化属性
    Person(int a, int b, int c) :my_A(a), my_B(b), my_C(c) {}
    
    int my_A;
    int my_B;
    int my_C;
    ~Person()  //析构函数
    {
        cout << "析构函数的调用" << endl;
    }
};

void test01()
{
    Person p(10,20,30);
    cout << "p.my_A=" <<p.my_A<< endl;
    cout << "p.my_B=" << p.my_B<<endl;
    cout << "p.my_C=" << p.my_C<<endl;
} 
    

int main()
{ 
    test01();
    return 0;
}

类对象作为类的成员

C++类中的成员可以是另一个类的对象,我们称该成员为对象成员

class A()
class B
{
   A a;
}

那么当创建B对象时,A与B的构造和析构顺序是谁先谁后?
当其他类对象作为本类成员,构造时候先构造类对象再构造自身,析构的顺序与构造相反

#include <iostream>
#include <string>
using namespace std;

class Phone {
public:
    Phone(string pName)
    {
        m_PName = pName;
        cout << "Phone构造函数的调用" << endl;
    }


    string m_PName;
    ~Phone()  //析构函数
    {
        cout << "Phone析构函数的调用" << endl;
    }

};

class Person
{
   
public:
    //姓名
    string m_Name;
    //手机
    Phone m_Phone;
    Person(string name, string pName) :m_Name(name),m_Phone(pName){
    
        cout << "Person构造函数的调用" << endl;
    }//Phone m_Phone=pName(隐式转换法)
   
    ~Person()  //析构函数
    {
        cout << "Person析构函数的调用" << endl;
    }
};

void test01()
{
    Person p("张三","苹果MAX");
    cout << p.m_Name << " take " << p.m_Phone.m_PName << endl;
} 
    

int main()
{ 
    test01();
    return 0;
}



输出结果:
在这里插入图片描述

静态成员

静态成员:在成员变量和成员函数前加上关键字static

静态成员分为:

  • 静态成员变量
    • 所有对象共享同一份数据
    • 在编译阶段分配内存
    • 类内声明,类外初始化
  • 静态成员函数(两种访问方式)
    • 所有对象共享同一个函数
    • 静态成员函数只能访问静态成员变量
class Person
{
public:
static void func()
{
cout<<"static void func()的调用"<<endl;
}
//静态成员函数也有访问权限
privatestatic void func2()
{
cout<<"static void func2()的调用"<<endl;
}
};

void test01()
{
//通过对象访问
Person p;
p.func();
//通过类名访问
Person::func();

}



成员变量和成员函数分开存储

在C++中,类内的成员变量和成员函数分开存储,只有非静态变量才属于类的对象上

当只创建一个空的类:
在这里插入图片描述
空对象占用的内存空间为:1
在这里插入图片描述
C++编译器会给每个对象也分配一个字节空间,是为了区分空对象占内存的位置
因此每个空对象也应该有一个独一无二的内存地址

当加入一个非静态成员变量后:
在这里插入图片描述
在这里插入图片描述
再加入一个静态成员变量后:
在这里插入图片描述
依然为4:
在这里插入图片描述
同样的对于成员函数,无论静态还是非静态都不属于类的对象上。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中实现属性 本文译自http://www.codeguru.com/cpp_mfc/Property.html的Implementing a Property in C++ 以下是译文 本文由Emad Barsoum投稿。 开发测试环境:Visual C++ 7.0, Windows XP sp1, Windows 2000 sp3 摘要 本文试着在C++中不使用任何扩展技术模拟C#(或其他语言)中的属性特征。大多数在C++实现属性的库和编译器使用扩展技术,如Managed C++C++ Builder,或者他们使用如通常函数的set和get方法,但那不是属性。 详述 我们首先看一下什么是属性。一个属性表现为一个字段或者成员变量,但它通过read和write方法或者get和set方法暗中操作变量。 例如,若存在A和它的属性Count,我可以写如下的代码: A foo; Cout << foo.Count; 实际上Count调用它的get函数返回当前的变量值。你可以将属性定为只读(你可以读取它但不能修改它)、只写或者可读写,这就是使用属性而不直接使用变量的的一个最大好处了。好了,让我们开始来实现它: 我们需要能做如下的事: int i = foo.Count; //--调用get函数得到值 foo.Count = i; //-- 调用set函数设定值 因此,很明显的我们需要重载 = 操作符使其能设定变量的值,同时也要重载该属性的返回值(在下面我们将会看到的)。 我们将实现一个称为property的,它做的就像一个属性,声明如下: template class property {} 这个模板表示的是我们的属性。Container是我们要在其中包含属性变量,set和get方法以及属性型。ValueType是内部变量即要定义的属性型,nPropType定义属性的读写标志:只读、只写或可读写。 现在我们需要一个指向从包含属性Container到属性property的set和get方法的指针,同时重载 = 操作符以使得属性能象变量起那样作用。现在我们来看property的全部定义 #define READ_ONLY 1 #define WRITE_ONLY 2 #define READ_WRITE 3 template class property { public: property() { m_cObject = NULL; Set = NULL; Get = NULL; } //-- 将m_cObject指向包含属性的container -- void setContainer(Container* cObject) { m_cObject = cObject; } //-- 设定可改变属性值的set成员函数 -- void setter(void (Container::*pSet)(ValueType value)) { if((nPropType == WRITE_ONLY) || (nPropType == READ_WRITE)) Set = pSet; else Set = NULL; } //-- 设定可检索属性值的get成员函数 -- void getter(ValueType (Container::*pGet)()) { if((nPropType == READ_ONLY) || (nPropType == READ_WRITE)) Get = pGet; else Get = NULL; } //-- 重载 = 号操作符使其能用set成员设定属性值-- ValueType operator =(const ValueType& value) { assert(m_cObject != NULL); assert(Set != NULL); (m_cObject->*Set)(value); return value; } //-- 使属性能转换为内部型成为可能-- operator ValueType() { assert(m_cObject != NULL); assert(Get != NULL);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值