精华内容
下载资源
问答
  • 在类的成员声明时
    千次阅读
    2019-06-20 10:30:30

    1.什么是静态成员
    静态成员是类的所有对象共享的成员,而不是某个对象的成员。
    静态成员分为静态数据成员静态成员函数
    2.静态数据成员
    如果某个属性为整个类所共有,不属于任何一个具体对象,则采用static关键字来声明为静态数据成员,例如:银行账户的利率
    静态数据成员在类中只有一个拷贝,不占用对象的存储空间,由该类的所有对象共同维护和使用
    3.静态成员函数
    如果某个方法为整个类所共有,不属于任何一个具体对象,则采用static关键字来声明为静态成员函数
    静态成员函数形参表中没有this指针形参,因此,静态成员函数内不能直接访问this指针

    4.使用方法:
    //student.h
    class Student
    {
    public: Student(); ~Student();
    Student(int pid,char * pname,float s);
    Student(const Student& init);
    void Display();
    static int Number( ); //静态成员函数的声明
    private: int id;
    char * name;
    float score;
    static int total; //静态数据成员的声明,代表班级学生总人数
    };
    //在类体外实现时不要加static关键字,否则错误 且其返回值必须是静态的
    //student.cpp
    int Student::Number()
    {//} //Right
    static int Student::Number()
    {//} //Error

    类内非静态成员函数可以直接访问非静态成员、静态成员;静态成员函数可以直接访问静态成员,通过对象访问非静态成员

    类外访问静态成员受成员访问权限的控制,可以有2种方法:
    (1)采用类外访问非静态成员的方法
    通过对象名、对象指针、对象引用访问公有静态成员
    for example: S1.Number( ) //S1为创建的对象

    (2)采用类名加作用域限定符的方法
    <类名>::<公有静态成员>
    for example: Student::Number( )
    且在类的实现前要进行静态成员的初始化和分配空间,即在cpp中定义类中成员函数前,需给静态成员分配空间和初始化

    静态成员与全局对象的区别
    1.静态成员的名字是在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突
    可以实施封装。
    2.静态成员可以是私有成员,而全局对象不可以
    3.通过阅读程序容易看出静态成员是与特定类关联的,可以清晰地显示程序员的意图

    更多相关内容
  • c++能不能给成员变量在声明的时候初始化?

    千次阅读 多人点赞 2018-10-19 21:19:33
    有人说在声明的时候初始化相当于构造函数中初始化,其实不是的,成员变量初始化的顺序为:先进行声明时初始化,然后进行初始化列表初始化,最后进行构造函数初始化,如下代码:(另外初始化列表中初始化的顺序是和...

    能。可能早先的版本不能,但是c++11标准下能。有人说在声明的时候初始化相当于在构造函数中初始化,其实不是的,成员变量初始化的顺序为:先进行声明时初始化,然后进行初始化列表初始化,最后进行构造函数初始化,如下代码:(另外初始化列表中初始化的顺序是和变量声明的顺序一样,而与列表中的顺序无关)

    #include "stdafx.h"
      #include <iostream>
      using namespace std;
      class A 
      {
      public:
          int a = 1;
          A() {}
          A(int a_):a(a_){}
         A(int a_, bool b) :a(4) { a = a_; }
     };
     
     int main()
     {
         A a1, a2(3), a3(5, true);
         cout << "a1.a=" << a1.a << endl;
         cout << "a2.a=" << a2.a << endl;
         cout << "a3.a=" << a3.a << endl;
         system("pause");
         return 0;
     }

    结果如图,可看出,初始化列表初始化的变量值会覆盖掉声明时初始化的值,而构造函数中初始化的值又会覆盖掉初始化列表的,足以看出初始化的顺序:

    另外有人说这种初始化方式破坏了类的抽象性。是的,一定程度上,但是却能带来很大便捷。好比一台机器能够生产某种零件,零件的各个尺寸可以在一定程度任意改变,但是我们并不是每次生产这种零件都需要一个一个地给定每一个参数,然后再生产,机器会自己带有一套“默认”的零件尺寸参数,这样新手可以直接用默认参数生产,除非你知道每一个参数都是干啥的,否则没必要更改。那么也可以在构造函数中给出这一套“默认参数”啊,是的,但是假如你有10个构造函数,那么你每一个都要复制一次所有成员变量的默认参数吗?显然在做重复的无用工作,那么为什么不直接在声明的时候就初始化!

    展开全文
  • 使用函数,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数)。例如私有的成员函数只能被本中的其它成员函数所调用,而不能被外调用。成员函数可以访问本中任何成员...

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中。它可以被指定为private(私有的)、public (公用的)或protected(受保护的)。

    在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数)。例如私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用。成员函数可以访问本类中任何成员(包括私有的和公用的),可以引用在本作用域中有效的数据。

    一般的做法是将需要被外界调用的成员函数指定为public,它们是类的对外接口。但应注意,并非要求把所有成员函数都指定为public。有的函数并不是准备为外界调用的,而是为本类中的成员函数所调用的,就应该将它们指定为private。这种函数的作用是支持其它函数的操作,是类中其它成员的工具函数(utility function),类外用户不能调用这些私有的工具函数。

    类的成员函数是类体中十分重要的部分。如果一个类中不包含成员函数,就等同于C语言中的结构体了,体现不出类在面向对象程序设计中的作用。

    在类外定义成员函数

    在前面已经看到成员函数是在类体中定义的。也可以在类体中只写成员函数的声明,而在类的外面进行函数定义。如:

    class Student
    {
    public :
    void display( ); //公用成员函数原型声明
    private :
    int num;
    string name;
    char sex;
    //以上3行是私有数据成员
    };
    void Student::display( )//在类外定义display类函数
    {
    cout<<"num:"<<num<<endl;
    cout<<"name:"<<name<<endl;
    cout<<"sex:"<<sex<<endl;
    }
    Student stud1,stud2; //定义两个类对象
    

    注意:在类体中直接定义函数时,不需要在函数名前面加上类名,因为函数属于哪一个类是不言而喻的。

    但成员函数在类外定义时,必须在函数名前面加上类名,予以限定(qualifed)," :: "是作用域限定符(field qualifier)或称作用域运算符,用它声明函数是属于哪个类的。

    如果在作用域运算符“::”的前面没有类名,或者函数名前面既无类名又无作用域运算符“::”,如
    ::display( ) 或 display( )
    则表示display函数不属于任何类,这个函数不是成员函数,而是全局函数,即非成员函数的一般普通函数。

    类函数必须先在类体中作原型声明,然后在类外定义,也就是说类体的位置应在函数定义之前,否则编译时会出错。

    虽然函数在类的外部定义,但在调用成员函数时会根据在类中声明的函数原型找到函数的定义(函数代码),从而执行该函数。

    在类的内部对成员函数作声明,而在类体外定义成员函数,这是程序设计的一种良好习惯。如果一个函数,其函数体只有2-3行,一般可在声明类时在类体中定义。多于3行的函数,一般在类体内声明,在类外定义。

    展开全文
  • c++类成员变量初始化详解

    千次阅读 2022-04-15 10:08:24
    1.初始化顺序 当初始化的时候,会调用其构造函数并进行初始化。...第一种方式是在成员变量声明时初始化。可以看如下示例。 class D { int a = 10; }; 在声明变量a的时候即给其初始化为10。不过注意这种写法是c++1

    1.类初始化顺序

    当类初始化的时候,会调用其构造函数并进行初始化。当对象结束其生命周期,会调用析构函数进行资源回收。

    注意类在调用资深构造函数之前,首先会调用其成员变量构造函数并进行初始化,再进入自身构造函数进行初始化。成员变量的声明顺序,就是初始化顺序。后面我们提到的很多情况就跟这个有关系,后面再进行详细解读。

    2.声明时初始化

    第一种方式是在成员变量声明时初始化。可以看如下示例。

    class D {
        int a = 10;
    };
    

    在声明变量a的时候即给其初始化为10。不过注意这种写法是c++11以后才有的。上述代码在IDE中会有如下警告信息:

    in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions]
    

    3.构造函数初始化列表

    第二种方式是在构造函数中加入一个初始化列表,对成员变量进行初始化。

    class D {
        int a, b;
        string c;
        public:
            D() : a(1), b(2), c("sss") {
                cout<<"a is: "<<a<<endl;
                cout<<"b is: "<<b<<endl;
                cout<<"c is: "<<c<<endl;
            }
    };
    

    如果我们对D进行实例化,

    int main(int argc, char const *argv[])
    {
        D d;
        return 0;
    }
    

    代码会有如下输出

    a is: 1
    b is: 2
    c is: sss
    

    4.构造函数内部赋值

    在其他语言中,比如java,最常用的方式为在构造函数内部赋值。

    class D {
        int a, b;
        string c;
        public:
            D(int a, int b, string c) {
                this->a = a;
                this->b = b;
                this->c = c;
                cout<<"a is: "<<a<<endl;
                cout<<"b is: "<<b<<endl;
                cout<<"c is: "<<c<<endl;
            }
    };
    
    int main(int argc, char const *argv[])
    {
        D d(1, 2, "sss");
        return 0;
    }
    

    上面代码输出为

    a is: 1
    b is: 2
    c is: sss
    

    5.只能构造函数初始化列表的情况

    如果一个类成员,他本身是一个类或者结构,而且这个类成员没有默认的无参构造函数,只有带参数的构造函数,这个时候对类成员初始化时,必须调用类成员带参数的构造函数。如果再初始化列表中没有完成类成员初始化,代码会报错。

    };
    
    class F {
        E e;
        public:
            F() {cout<<"init F class!"<<endl;}
    };
    
    int main(int argc, char const *argv[])
    {
        F f;
        return 0;
    }
    

    上述代码是可以正常运行的,因为类E有默认无参构造函数。

    而如果将代码改为下面的样子,给E加一个带参数的构造函数

    class E {
        int num;
        public:
            E(int n) {
                this->num = n;
            }
    };
    
    class F {
        E e;
        public:
            F() {cout<<"init F class!"<<endl;}
    };
    
    int main(int argc, char const *argv[])
    {
        F f;
        return 0;
    }
    

    上面代码在IDE里直接会报错:

    constructor for 'F' must explicitly initialize the member 'e' which does not have a default constructor
    

    此时需要将F的构造函数改成如下形式:

    class F {
        E e;
        public:
            F() : e(10) {cout<<"init F class!"<<endl;}
    };
    

    另外,如果类的成员变量中有const时候,也需要在成员初始化列表中赋值完成初始化。

    class F {
        private:
            const int num;
        public:
            F(): num(10) {}
    };
    

    比如上面类F中有一个const常量num,就需要再F构造函数列表中对其进行赋值,否则代码会报错。

    6.列表初始化与构造函数初始化区别

    当采用列表初始化的时候,代码直接调用了成员变量的构造函数,只需要一步就可以完成。
    而在构造函数中初始化的时候,先调用的是成员变量的默认构造函数构造了类成员,然后再调用赋值运算符对之前默认构造的类成员进行赋值,这实际上进行了两步操作。
    当类的结构较为复杂的时候,会存在性能上的差异。

    展开全文
  • using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{ class Class1 { int a;... }}这是我新建的,它报错并提示我这个。但如...
  • 【C++】中静态成员声明、初始化中静态成员声明初始化静态数据成员值的改变完整例子 有参考大佬 零点零一 的文章:https://blog.csdn.net/thanklife/article/details/78476737 中静态成员声明 中的静态...
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • 命名空间是一个范畴,它包含类声明,函数声明,常量声明和模板声明等名字空间成员。本文拟讨论如何名字空间中声明自己的和函数,以及如何程序中...使用C++类时,如果用到命名空间,使用的时候需要前置声明
  • C++ 静态成员变量声明和定义

    千次阅读 2018-11-04 16:45:36
    这是学习C++中的一个简单总结 静态成员变量的声明和定义的
  • 关于C++ 中数据成员在定义初始化问题。

    万次阅读 多人点赞 2019-06-12 15:31:14
    很多人习惯上在声明变量就赋上初值,但对于c++中的数据成员能否这样做呢? 显然是不行的,这是编译语法的规定。因为就相当于一个数据的模板,是一种自定义组合的新数据类型,而不是一个变量。当程序声明一个...
  • 对于C++23标准,如果我们想要某个成员变量能被此类的所有对象访问,且该变量不可修改,那么我们一般会选择将该变量声明为静态成员常量。例如此代码: class Decrypter{ static const int mask = 0x8a; public...
  • 成员函数(简称函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个成员,出现在类体中。它可以被指定为private(私有的...
  • C++通过及相关的封装、继承、多态和虚函数机制支持面向对象的程序设计和开发。...C++中声明(也又称)式如下:class 类名 { 访问范围说明符: 成员变量1; 成员变量2; ... 成员函数1声明; 成员函数1定义;
  • C++类成员函数指针使用介绍

    万次阅读 多人点赞 2019-09-21 16:07:49
    之前写过的博客中有介绍过函数指针和指针函数的区别和简单用法(文章这里),当时的Demo非常简单,都是C语言的写法,但是当C++中直接像C那样使用类成员函数指针就会报错:reference to non-static member ...
  • 的静态数据成员 内只能声明,定义和初始化必须在类外 可以这样 class a { int aa; static int aaa; //静态数据成员声明 }; int a::aaa=10; //静态数据成员的定义和初始化
  • 开发环境 VS2017 代码如下: CBrick* CTetrisGame::createNewBrick(int &brickindex);...错误(活动) E0392 不能在成员函数 "CTetrisGame::createNewBrick" 的外部重新声明该函数 Tetris_Game E:\Ess...
  • 继承之外,C++中一个类成员函数调用另一个类成员的方法主要有:类的组合,友元类,类的前向声明,单例模式等,下面主要讲讲这4种方法的实现 方法1:利用类的组合 组合通俗来讲就是类B有类A的属性,如声明一个...
  • 友元提供了不同成员函数之间、成员函数与一般函数之间进行数据共享的机制。通过友元,一个不同函数或另一个中的成员函数可以访问中的私有成员和保护成员。c++中的友元为封装隐藏这堵不透明的墙开了一个...
  • 题目要求: 以上程序(第2章习题第2小题)基础上进行修改: 在类体内声明成员函数,在类外定义成员函数。 ——谭浩强的《C++面向对象程序设计》第2章习题第3小题
  • C++ 语言的私有成员

    千次阅读 2020-02-24 15:39:47
    定义类成员时使用关键字 private,可以得到所需的安全性。通常情况下,私有类成员只能被类的成员函数访问,有一种情况例外。普通的函数没有访问私有类成员的直接途径。 指定私有类成员能够将类的接口与类的内部...
  • 相关文章 ...当调用一个对象的非静态成员函数,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数并不属于某一对象(所有对象共有,没有this指针,不能访问本中非静态成员,有点...
  • 测试结果是private和public两种情况是不同的。 ...如果是private,编译阶段就会报错:‘void ...有种常用的做法,为了禁掉一个的拷贝函数和等号操作符,可以将他们声明为私有,但是不用定义。
  • 今天学习一下成员...如果写在类的里面就叫做成员函数 int sum(int x, int y)//写在类的外部 { return x + y; } class Sales_item { public: std::string isbn;//书号 unsigned units_sold;//数量 do...
  • 一个的对象作为另一个的数据成员。 &nbsp; &nbsp; &nbsp; &nbsp;一个中的数据成员除了可以是int, char, float等这些基本的数据类型外,还可以是某一个的一个对象。用子对象创建新。 &...
  • 今天尝试自己实现vector数据结构底层,定义vector模板的时候,还想像往常一样把分为.h文件和.cpp文件,把成员函数的声明放在.h文件中,把具体实现放在.cpp文件中,结果测试发现编译过程中报错。...
  • 题目是关于静态变量在类中的初始化。 首先判断下列代码的正误。 class example{ public: //static double rate=6.5; static const int size; std::vector vec(size); }; 代码是这样的。 当时我一看,觉得没有...
  • “通常情况下,你会.h文件中声明函数和,而将它们的定义放置一个单独的.cpp文件中。但是使用模板,这种习惯性做法将变得不再有用,因为当实例化一个模板,编译器必须看到模板确切的定义,而不仅仅是它的...
  • C++命名空间中声明类成员函数

    千次阅读 2018-06-24 15:47:22
    首先关于前置声明,有以下几点要注意:b.h头文件中引入a,有两种方式,前置声明和 #include “a.h”,建议使用前置声明,当a.h的私有成员改变,b.h不需要重新编译。所以能用前置声明代替#include 的时候,...
  • C++中在类外部定义的成员函数

    千次阅读 多人点赞 2020-10-14 10:22:21
    当定义在类的外部,需要同时提供类名和函数名。 1 外部定义成员函数 代码如下所示 classMyClass{ voidmyFunc(); inti; }; voidMyClass::myFunc() { i = 1; } 此时MyClass的成员函数myFunc()MyClass...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 642,260
精华内容 256,904
热门标签
关键字:

在类的成员声明时