关于一个基本的C++语法问题。

zdrone 2008-04-08 04:57:51
#include <iostream.h>
#include "mycls.h"

void main()
{
cout<<"hello world";
mycls cls;
cls.output();

}

mycls.h

class mycls
{
public:
static int sa;
void output();
};
mycls.cpp
#include "mycls.h"
#include <iostream.h>

int mycls::sa;

void mycls::output()
{
cout<<"this is myclass \n";
sa=10;
cout<<sa;
}

在mycls.cpp中使用mycls.h头文件中定义的 static int sa; 为什么非要在头上写上int mycls::sa;
否则编译器会提示 unresolved external symbol 没有解决的外部变量。这个是什么原理?c++原理忘记了,也不知道书上哪地方讲到
只能来问问各位了
...全文
105 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
davidyoung8906 2008-04-08
  • 打赏
  • 举报
回复
变量前面用类引用...声明变量不都要写类名的么...为什么明确是静态成员了啊...
昨夜无风 2008-04-08
  • 打赏
  • 举报
回复
class mycls
{
.....

};

大括号外面就是类外面。
lake_cx 2008-04-08
  • 打赏
  • 举报
回复
头文件中是声明,cpp中是实现,头文件中定义只是告诉编译器,会有这个东西,要等到编译到cpp的时候才知道开始告诉它有的那个东西原来就是这而实现的。
所以你没加实现的话,编译器就会找不到该有的东西,它就提示无法解析的外部符号,也就是所声明的符号外面应该有实现,但它没找到,没法解析这个符号。
至于cpp中不写static,大概是因为写法是变量前面用类引用,已经很明确是静态成员了吧。
davidyoung8906 2008-04-08
  • 打赏
  • 举报
回复
为什么在.cpp里不要声明static阿...
davidyoung8906 2008-04-08
  • 打赏
  • 举报
回复
类外面定义一次??
类外面是哪里啊...
cnzdgs 2008-04-08
  • 打赏
  • 举报
回复
类中的定义只是声明,一般成员变量是在类的实例中分配储存单元,静态变量不在实例中,必须单独定义。
  • 打赏
  • 举报
回复
类的静态变量需要在类外面定义一次
菜牛 2008-04-08
  • 打赏
  • 举报
回复
否则编译器会提示 unresolved external symbol 没有解决的外部变量。知道这么做就行了。
bluesky12312388 2008-04-08
  • 打赏
  • 举报
回复
#include <iostream.h>
#include "mycls.h"

void main()
{
cout < <"hello world";
mycls cls;
cls.output();

}

mycls.h

class mycls
{
public:
static int sa;
void output();
};
mycls.cpp
#include "mycls.h"
#include <iostream.h>

int mycls::sa; 把这句改成int mycls::sa = 10;静态数据成员必须这样初始化

void mycls::output()
{
cout < <"this is myclass \n";
//sa=10;
cout < <sa;
}
TeddyGe 2008-04-08
  • 打赏
  • 举报
回复
你可以看看静态变量这一节有关它的讲述

对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷 贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共 用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;
静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。语句int mycls::sa=0;是定义静态数据成员;
静态数据成员和普通数据成员一样遵从public,protected,private访问规则;
因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它;
静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:
<数据类型><类名>::<静态数据成员名>=<值>
类的静态数据成员有两种访问形式:
<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员 ;
静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成员。这 有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。第二,一旦利息需要改变时,只要改变一次, 则所有存款类对象的利息全改变过来了;
同全局变量相比,使用静态数据成员有两个优势:
静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;
可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能;
oakfire 2008-04-08
  • 打赏
  • 举报
回复
我所知道的是,静态成员不能在类构造函数初始化,必须在定义时初始化,一次就行。而最好的办法,便是在该类CPP里定义一次。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧