非静态成员sizeof

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lixiaogang_theanswer/article/details/79982720

目录

1.sizeof描述

strlen不一样,在c中strlen是一个字符串函数;用来求字符串的实际长度,不包含‘\0’`;
示例1:

/*************************************************************************
 * File Name: strlen.cpp
 * Author:    The answer
 * Function:  Other        
 * Mail:      2412799512@qq.com 
 * Created Time: 2018年04月11日 星期三 02时50分00秒
 ************************************************************************/

#include<iostream>
#include<string.h>
#include<string>
using namespace std;
int main(int argc,char **argv)
{
    char str[] = "hello world.";
    int len = strlen(str);
    cout<<"len :"<<len<<endl;
    return 0;
}

输出结果:
len : 12

sizeof却是一个操作符,类似与算法运算符+ - * / ++ -- *=、条件运算符> >= < <= == !=等。其功能是用来求某个变量或类型所占用的内存空间大小。

示例2:

/*************************************************************************
 * File Name: sizeof.cpp
 * Author:    The answer
 * Function:  Other        
 * Mail:      2412799512@qq.com 
 * Created Time: 2018年04月17日 星期二 23时07分39秒
 ************************************************************************/

#include<iostream>
#include<map>
#include<vector>
using namespace std;
int main(int argc,char **argv)
{
    int arr[] = {1,2,3,4,5,6};
    int len = sizeof(arr);
    cout<<len<<endl;
    return 0;    
}

输出结果:
24  //arr数组所占用内存空间大小为24bytes

c++引入了类class类型之后,sizeof的定义也进行了扩展。

2. c++98中,对非静态成员变量使用sizeof是不能够通过编译的

示例3:

/*************************************************************************
 * File Name: sizeof.cpp
 * Author:    The answer
 * Function:  Other        
 * Mail:      2412799512@qq.com 
 * Created Time: 2018年04月11日 星期三 03时03分59秒
 ************************************************************************/

#include<iostream>
using namespace std;
class Parent
{
    public:
        Parent(){}
        Parent(int a):m_a(a){}
        ~Parent(){}

    public:
        int m_a;
        static int m_b; //静态成员变量
};

int Parent::m_b = 0;    //静态成员变量在类外进行初始化

int main(int argc,char **argv)
{
    Parent p;
    cout<<sizeof(p.m_a)<<endl;         //c++98 编译通过 c++11通过
    cout<<sizeof(Parent::m_b)<<endl;   //c++98 编译通过 c++11通过 
    cout<<sizeof(Parent::m_a)<<endl;   //c++98 编译失败 c++11通过 
    return 0;
}

c++98中,只有对静态成员、对象的实例才能对其成员进行sizeof操作。而c++11中,对非静态的成员变量使用sizeof操作是可以成功编译通过的,是一个合法的操作。

附:若c++98中要实现上面的sizeof来求非静态成员变量,可以采用强制类型转换:

 cout<<sizeof((static_cast<Parent*>(0))->m_a)<<endl;
或
 cout<<sizeof(((Parent*)0)->m_a)<<endl;
展开阅读全文

无法调用非静态成员,加上static后又说无法识别

12-16

[code=c]rntemplaternclass Graph rnpublic:rn int vertexNum;rn int edgeNum;rn int *Mark; //就是这里!****!!*******!!!rn Graph(int verticesNum) rn vertexNum = verticesNum;rn edgeNum = 0;rn Mark = new int[vertexNum];rn for (int i = 0; i < vertexNum; i++) rn Mark[i] = UNVISITED;rn rn rn ~Graph() rn delete[] Mark;rn //delete[] Indegree;rn rn virtual Edge FirstEdge(int oneEdge) = 0;rn virtual Edge NextEdge(Edge oneEdge) = 0;rn static int VerticesNum() return vertexNum; rn static int EdgesNum() return edgeNum; rn bool IsEdge(Edge oneEdge) rn if (oneEdge.weight > 0 && oneEdge.weight < INFINITY&&oneEdge.end >= 0)rn return true;rn elsern return false;rn rn static void visit(int v) Mark[v] = VISITED; rn static int StartVertex(Edge oneEdge) return oneEdge.start; rn static int EndVertex(Edge oneEdge) return oneEdge.end; rn T Weight(Edge oneEdge) return oneEdge.weight; rn virtual void setEdge(int start, int end, int weight) = 0;rn virtual void delEdge(int start, int end) = 0;rn void DFS(int v);rn void DFSTraverse();rn void BFS(int v);rn void BFSTraverse();rn rn;rntemplaternvoid Graph::DFS(int v) rn Mark[v] = VISITED;rn visit(v);rn for (Edge e = FirstEdge(v); IsEdge(e); e = NextEdge(e)) rn if (Mark[EndVertex(e)] == UNVISITED)rn DFS(EndVertex(e));rn rnrn[/code]rn——代码是没加static的,错误是这样的:rn严重性 代码 说明 rn错误 C2597 对非静态成员“Graph::Mark”的非法引用 rn——在int *Mark;前加上static后:rn严重性 代码 说明 rn错误 LNK2001 无法解析的外部符号 "public: static int * Graph::Mark" (?Mark@?$Graph@H@@2PAHA) rn[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/8.gif][/img] 论坛

没有更多推荐了,返回首页