成员变量

C++ 导出dll 类成员变量问题debug记录

匿名 (未验证) 提交于 2019-12-03 00:19:01
今天因为项目原因需要将ubuntu下的工程移植到windows平台。在ubuntu下面我们使用的是qmake来构建的工程,在windows上面移植的时候,将工程构建软件替换为cmake。 在移植的时候,也在吐槽windows的版本管理,什么vs2013的库不能用于vs2015编译链接,debug版本不能链接release版本之类的设定。我反正觉得这些设定挺奇葩的,在实际情况中,我们常常需要链接一些第三方库,如果是外部人员提供的话,那么就会只有release版本,调试起来就很难受了。 在移植成功后遇到了一个问题,这个问题折腾了我还比较久的时间。就是在我们工程中自己编写的动态库dll中需要导出类。而在我们类是用单例做成的。所以要导出的类中有一个静态成员变量。在主程序链接的时候一直报错,没有找到该静态变量。 代码结构类似这样: dll h文件 #pragma once #include "stdio.h" #ifdef _DLL_INNER #define _EXPORT _declspec(dllexport) #else #define _EXPORT _declspec(dllexport) //#define _EXPORT _declspec(dllimport) #endif class _EXPORT ss { public: static ss * Ins() { if

C++中类中常规变量、const、static、static const(const static)成员变量的声明和初始化

匿名 (未验证) 提交于 2019-12-03 00:19:01
C++类有几种类型的数据成员:普通类型、常量(const)、静态(static)、静态常量(static const)。这里分别探讨以下他们在C++11之前和之后的初始化方式。 在C++11之前常规的数据成员变量只能在构造函数里和初始化列表里进行初始化。const类型的成员变量只能在初始化列表里并且必须在这里进行初始化。static类型只能在类外进行初始化。static const类型除了整型数可以在类内初始化,其他的只能在类外初始化。代码如下: class A { public : A (); ~A(); //int m_n1 = 10; // 错误 1 error C2864: “A::m_n1”: 只有静态常量整型数据成员才可以在类中初始化 int m_n2; int m_n3; //const int m_nConst_1 = 10; // 错误 3 error C2864: “A::m_nConst_1”: 只有静态常量整型数据成员才可以在类中初始化 const int m_nConst_2; const int m_nConst_3; const int m_nConst_4; // static int m_nStatic_1 = 10; // 错误 1 error C2864: “A::m_nStatic_1”: 只有静态常量整型数据成员才可以在类中初始化

C# 成员变量,本地变量、类变量

匿名 (未验证) 提交于 2019-12-03 00:18:01
成员变量(实例变量,属性) 成员变量:在类中定义,成员变量就是类中的属性。当new对象的时候,每个对象都有一份属性。一个对象中的属性就是成员变量。 作用范围:在类内部任何地方都可以访问成员变量。 声明周期:出生,new对象的时候,开辟内存空间。死亡,堆内存地址没有引用,变成垃圾,被垃圾回收器回收。 局部变量(本地变量) 局部变量:方法的形式参数以及在方法中定义的变量。 作用范围:在方法体重的任何位置都可以访问。 生命周期:出生:运行到创建变量的语句时。死亡:超过了其作用范围。 类变量(静态属性) 类变量:被static修饰的属性。 作用范围:在类变量定义之后。 生命周期:出生:类加载时,类变量就分配内存空间。死亡:JVM退出。 文章来源: C# 成员变量,本地变量、类变量

成员变量和局部变量区别

匿名 (未验证) 提交于 2019-12-02 23:49:02
变量根据 定义位置的不同 ,我们给变量起了不同的名字。如下图所示: 成员变量和局部变量区别 成员变量:类中,方法外 局部变量:方法中或者方法声明上(形式参数) 作用范围不一样 成员变量:类中 局部变量:方法中 初始化值的不同 成员变量:有默认值 局部变量:没有默认值。必须先定义,赋值,最后使用 在内存中的位置不同 成员变量:堆内存 局部变量:栈内存 生命周期不同 成员变量:随着对象的创建而存在,随着对象的消失而消失 代码举例 public class Demo01VariableDifference { String name; // 成员变量 public void methodA() { int num = 20; // 局部变量 System.out.println(num); System.out.println(name); } public void methodB(int param) { // 方法的参数就是局部变量 // 参数在方法调用的时候,必然会被赋值的。 System.out.println(param); int age; // 局部变量 // System.out.println(age); // 没赋值不能用 // System.out.println(num); // 错误写法! System.out.println(name); } }

局部变量为什么需要显式赋值,否则编译不了

匿名 (未验证) 提交于 2019-12-02 23:47:01
1、成员变量(全局变量)是可以不经初始化的,在类加载过程的准备阶段即可给它赋予默认值,但局部变量使用前需要显示赋予初始值,javac不是推断不出不可以这样做,而是没有这么做, 对于成员变量而言,其赋值和取值访问的先后顺序具有不确定性 ,对于成员变量可以在一个方法调用前赋值,也可以在方法调用后进行,这是运行时发生的,编译器确定不了,交给jvm去做比较合适。 2、 而对于局部变量而言,其赋值和取值访问顺序是确定的 。这样设计是一种约束,尽最大程度减少使用者犯错的可能。假使局部变量可以使用默认值,可能总会无意间忘记赋值,进而导致不可预期的情况出现。

类的定义及使用

匿名 (未验证) 提交于 2019-12-02 23:43:01
Java和现实事物的关系 Java程序就是对现实事物的模拟。 事物与类的对比 现实世界的一类事物: 属性 :事物的状态信息。‘ 行为 :事物能够做什么。 Java中用class描述事物: 成员变量 :对应事物的属性 成员方法 :对应事物的行为 类的定义格式 定义类: 就是定义类的成员,包括成员变量和成员方法。 成员变量 :在类中,方法外的变量就是成员变量 成员方法 :没有static关键字的方法 代码举例 定义Student类 package demo01 ; /* 定义一个类,用来模拟“学生”事物。其中就有两个组成部分: 属性(是什么): 姓名 年龄 行为(能做什么): 吃饭 睡觉 学习 对应到Java的类当中: 成员变量(属性): String name; // 姓名 int age; // 年龄 成员方法(行为): public void eat() {} // 吃饭 public void sleep() {} // 睡觉 public void study() {} // 学习 注意事项: 1. 成员变量是直接定义在类当中的,在方法外边。 2. 成员方法不要写static关键字。 */ public class Student { // 成员变量 String name ; // 姓名 int age ; // 姓名 // 成员方法 public void eat ()

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

匿名 (未验证) 提交于 2019-12-02 23:43:01
变量的种类 根据定义位置的不同,我们给变量起了不同的名字。如下图所示: 成员变量:类中,方法外 局部变量:方法中或者方法声明上(形式参数) 成员变量:类中 局部变量:方法中 成员变量:有默认值 局部变量:没有默认值。必须先定义,赋值,最后使用 成员变量:堆内存 局部变量:栈内存 成员变量:随着对象的创建而存在,随着对象的消失而消失 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失 代码举例 package demo03; /* 局部变量和成员变量 1. 定义的位置不一样【重点】 局部变量:在方法的内部 成员变量:在方法的外部,直接写在类当中 2. 作用范围不一样【重点】 局部变量:只有方法当中才可以使用,出了方法就不能再用 成员变量:整个类全都可以通用。 3. 默认值不一样【重点】 局部变量:没有默认值,如果要想使用,必须手动进行赋值 成员变量:如果没有赋值,会有默认值,规则和数组一样 4. 内存的位置不一样(了解) 局部变量:位于栈内存 成员变量:位于堆内存 5. 生命周期不一样(了解) 局部变量:随着方法进栈而诞生,随着方法出栈而消失 成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失 */ public class Demo01VariableDifference { String name; // 成员变量 public void methodA() { int

类的定义及使用

匿名 (未验证) 提交于 2019-12-02 23:26:52
类就是对现实事物的模拟 事物与类的对比 现实世界的一类事物: 属性 :事物的状态信息。 行为 :事物能够做什么。 Java中用class描述事物也是如此: 成员变量:对应事物的属性 成员方法:对应事物的行为 类的定义格式 定义类:就是定义类的成员,包括成员变量和成员方法。 成员变量:和以前定义变量几乎是一样的。只不过位置发生了改变。在类中,方法外。 成员方法:和以前定义方法几乎是一样的。只不过把static去掉。 对象的创建及使用步骤如下: 通常情况下,一个类不能直接使用,需要根据类创建一个对象,才能使用。 1.导包 :也就是指出需要使用的类,在什么位置 对于和当前类属于同一个包的情况,可以不写导包语句 2:创建对象 格式: 类名 对象名 = new 类名(); 3:使用对象访问类中的成员 对象名.成员变量; 对象名.成员方法(); 注意事项: 没有成员变量没有进行赋值,会有初始默认值,如下 类中的成员变量是随着对象进入堆内存中,独立存在的。而堆内存中保存的是方法的内存地址值 对象调用方法时,根据对象中方法标记(地址值),去类中寻找方法信息。这样哪怕是多个对象,方法信息只保存一份,节约内存空间 任何数据类型都可以作为方法的参数和返回值, 对象作为参数和返回值,传递和返回的都是对象的地址值 代码举例: package demo01; public class Student { /

java笔记

独自空忆成欢 提交于 2019-12-02 23:22:42
=====第一个java程序===== public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } 命令 $ javac HelloWorld.java $ java HelloWorld Hello World javac 后面跟着的是java文件的文件名,例如 HelloWorld.java。 该命令用于将 java 源文件编译为 class 字节码文件 java 后面跟着的是java文件中的类名,例如 HelloWorld 就是类名, 如: java HelloWorld。 =====package===== 1.解决类名冲突的问题 2.同一个包中的类不需要被导入,当代码使用外部包中的类时,需要用import语句导入包含该类的包。 3.代码使用外部包中的类,另外一个方法是在代码中使用类的完全限定名称。例如,在使用Scanner的代码中,如果省略了导入Scanner的语句,则需要在使用Scanner类的位置使用Java.util.Scanner 4.Java编译器默认为所有的Java程序引入了JDK的Java.lang 包中的所有的类。其中定义了一些常用类:System、String、Object、Math等

Java基础――继承和多态

匿名 (未验证) 提交于 2019-12-02 21:53:52
  面向对象的编程允许从已经存在的类中定义新的类,这称为继承。   面向过程的范式重点在于方法的设计,而面向对象的范式将数据和方法结合在对象中。面向对象范式的软件设计着重于对象以及对象上的操作。面向对象的方法结合了面向过程范式的强大之处,并且进一步将数据和操作集成在对象中。   继承可以使得你可以定义一个通用的类(即父类),之后扩充该类为一个更加特定的类(即子类)。在Java术语中,如果类C1扩展自另一个类C2,那么就将C1称为次类,将C2称为超类。 超类也称为父类或基类,次类又称为子类、拓展类或派生类。   子类从它的父类中继承可访问的数据域和方法,还可以添加新数据域和新方法。   如果父类中有私有的数据域,这个类被继承后,父类中的私有数据域是不能被子类访问的,唯一能读取和改变它们的方法就是通过它们的get和set方法。   和传统的理解不同,子类并不是父类的一个子集。实际上,一个子类通常比它的父类包含更多的信息和方法。   父类中的私有数据域在该类之外是不可访问的。因此,不能在子类中直接使用。但是,如果父类中定义了公共的访问器/修改器方法,那么可以通过这些公共的访问器/修改器来访问和修改它们。   不是所有的“是一种”关系都该用继承来建模。继承是用来为“是一种”关系建模的。不要仅仅为了重用方法这个原因而盲目地扩展一个类。   某些程序设计语言是允许从几个类派生出一个子类的