const对象,NULL和nullptr,C++中创建对象数组



1.定义成了const之后的类

#include <iostream>
class area
{
public:
	int x;
	int y;
	mutable int z;  //不受const约束的类成员
	area() :x(10), y(10), z(2)
	{

	}
	void printxy()const  //不可以访问类中局部变量
	{
		z = z + 1;
		std::cout << x << "  " << y  << "  " <<  z  << "\n";
	}
	void add(int a)
	{
		x += a;
		y -= a;
	}
	void go()const
	{
	}
protected:
private:
};

void main()
{
	//const对象不可以引用非const成员函数
	//不可以改变内部变量,mutable例外
	const area * const p = new area;
	p->go();
	//p->add();
	//p = new area;//指针可以改变

	const area area1;
	area1.printxy();
	//area1.add(1);
	area1.go();
	//area1.x = 10;
	//这一句说明当把类定义成const之后,定义成了mutable的值z可以修改
	area1.z += 4;
	area1.printxy();
	std::cin.get();
}

运行结果:

2.NULL和nullptr

#include <iostream>

void go(int num)
{
	std::cout << "gonum" << std::endl;
}

void go(void *p)
{
	std::cout << "gop" << std::endl;
}

//C++中的NULL的类型是int ,0
void main()
{
	//C++是强类型,严格的类型检查
	void *p = nullptr;//C++的null
	go(p);   //结果为gop  //根据类型来处理
	go(NULL);  //会调用go(int num)  结果为gonum
	go(nullptr);  //结果为gop
	std::cin.get();
}

3.QT中button和Line_edit操作相关的

QString  str1=ui->lineEdit->text();
QString  str2=ui->lineEdit_2->text();
QString str3=str1+str2;
ui->lineEdit_3->setText(str3);

QString  str1=ui->lineEdit->text();//获取文本
QString  str2=ui->lineEdit_2->text();
int  db1=str1.toInt();
int  db2=str2.toInt();//转换
int  db3=db1+db2;
QString str3;
str3.setNum(db3);//函数可以重载,很多个类型
ui->lineEdit_4->setText(str3);//设置文本

将QString转换成为字符串的是:str3.toStdString().c_str;

4.new delete和malloc,free相关

#include<iostream>
#include <stdlib.h>

class myclassA
{
public:
	myclassA()
	{
		std::cout << "create\n";
	}
	~myclassA()
	{
		std::cout << "delete\n";
	}
protected:
private:
};

void main()
{
	//new delete自动调用构造析构
	myclassA *p = new myclassA;
	delete p;

	//只会分配内存,释放内存,不会对内存进行操作
	myclassA *p1 = (myclassA *)malloc(sizeof(myclassA));
	free(p1);
	std::cin.get();
}

案例2

</pre><pre class="cpp" name="code">#include<iostream>

class myclass
{
public:
	int x;
	int y;
public:
	myclass(int a, int b) :x(a), y(b)
	{
		std::cout << "构造哦" << std::endl;
	}
	myclass()
	{
	}
	~myclass()
	{
		std::cout << "销毁哦" << std::endl;//
	}

public:
	void printxy();
protected:
private:
};
void myclass::printxy()
{
	std::cout << x << "  " << y << std::endl;
}
myclass class1(10, 11);//全局变量优先main函数
myclass class2(11, 12);

void change1(myclass **pp)
{
	*pp = &class2;
}
void change2(myclass * &p)
{
	p = &class1;
}

void  main22()
{
	myclass *p = &class1;
	p->printxy();
	change1(&p);
	p->printxy();
	change2(p);
	p->printxy();
	std::cin.get();
}

void main11()
{
	//myclass *p = new myclass;
	myclass *p(new myclass(10, 9));//构造函数初始化
	p->printxy();
	myclass  class1(20, 1);
	myclass ** pp = &p;//二级指针存储一级指针的地址
	(*pp)->printxy();//一级类指针
	(**pp).printxy();//0级类指针
	std::cin.get();
}

void main122()
{
	//myclass *p = (myclass *)malloc(sizeof(myclass));
	//free(p);
	myclass *p = new myclass;
	delete p;

	std::cin.get();
}

5.创建对象数组

#include "dialog.h"
#include <QApplication>

class morewindow
{
public:
    Dialog *p[5];
    morewindow()
    {
        for(int i=0;i<5;i++)
         {
             p[i]=new Dialog;
             p[i]->show();
             p[i]->move(i*100,i*100);
         }
    }
    ~morewindow()
    {
        for(int i = 0;i<5;i++)
        {
            delete p[i];
        }
    }
    Dialog * operator [](int i)
    {
        return p[i];
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    morewindow more1;
    more1[3]->hide();//重载下标

    return a.exec();
}

6.创建对象数组


#include "mainwindow.h"
#include <QApplication>
#include<QDebug>

class morewindows
{
public:
    MainWindow *p[5];//指针数组,每一个元素是指针
    morewindows()
    {
        for(int i=0;i<5;i++)
        {
            p[i]=new MainWindow;
            p[i]->show();
            p[i]->move(i*100,i*100);
        }
    }
    ~morewindows()
    {
        for(int i=0;i<5;i++)
        {
           delete p[i];
        }
    }
};

class morewindowss
{
public:
    MainWindow *p[5][4];
    morewindowss()
    {
        for(int i=0;i<5;i++ )
        {
            for(int j=0;j<4;j++)
            {
                p[i][j]=new MainWindow;
                p[i][j]->show();
                p[i][j]->move(i*130,j*130);
            }
        }
    }
    ~morewindowss()
    {
        for(int i=0;i<5;i++ )
        {
            for(int j=0;j<4;j++)
            {
              delete p[i][j];
            }
        }
    }
};

//int a[5]   int *p=a;   int *p= new int[5];
//int *a[5]   int **p=a  int **p=new  (int *)[5];
//int  *a[3][5]
//int * (*p)[5]

class morewindowsss
{
public:
    MainWindow  **p;//二级指针
    morewindowsss()
    {
       // p= (MainWindow **)malloc(sizeof(MainWindow *)*5);
    }
    void init(int num)
    {
        p= new MainWindow * [5];//new的时候类型不需要加上括号

        for(int i=0;i<5;i++)
        {
            p[i]=new MainWindow;
            p[i]->show();
            p[i]->move(num*100,i*100);
        }
    }

    void move(int x,int y)
    {
        for(int i=0;i<5;i++)
        {

            p[i]->move(x*100,y*100);
        }
    }
    morewindowsss  & operator = (morewindowsss const & more)//自己写的深拷贝
    {
        qDebug()<<"shen";
        this->p = new MainWindow * [5];

        for(int i=0;i<5;i++)
        {
            p[i]=new MainWindow;
            p[i]->show();
            p[i]->move(500,i*100);
        }
        return *this;
    }
    ~morewindowsss()
    {
        for(int i=0;i<5;i++)
        {
           delete p[i];

        }
        delete [] p;
       // free(p);
    }
};

class morewindowssss
{
public:
   // MainWindow *p[5][4];//二维数组,每一个元素都是指针
    MainWindow  **pA;//二级指针
    MainWindow *(*p)[4];//指向二维指针数组的指针
    morewindowssss()
    {
        pA=new  MainWindow  *[20];//一维数组
        p=(MainWindow *(*)[4])  pA;

        for(int i=0;i<5;i++ )
        {
            for(int j=0;j<4;j++)
            {
                p[i][j]=new MainWindow;
                p[i][j]->show();
                p[i][j]->move(i*130,j*130);
            }
        }
    }
    ~morewindowssss()
    {
        for(int i=0;i<5;i++ )
        {
            for(int j=0;j<4;j++)
            {
              delete p[i][j];
            }
        }
        delete [] pA;
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    morewindowsss   more1;
    more1.init(1);
    // more1.move(1,2);

    morewindowsss   more2;//拷贝构造
    more2=more1;//赋值

    // morewindowsss   more2(more1);
    more2.move(3,4);

    return a.exec();
}

 

时间: 2025-01-26 00:03:55

const对象,NULL和nullptr,C++中创建对象数组的相关文章

【C/C++学院】0820-Nullptr/const对象/类指针引用以及mallocfree与newde/类重载运算符/QT加法重载/类的重载赋值运算/自增在前在后差别/赋值重载深浅拷贝/重载下标

Nullptr #include<iostream> void go(int num) { std::cout << "gonum" << std::endl; } void go(void *p) { std::cout << "gop" << std::endl; } void main() { //void *p = nullptr; void *p = NULL;//C++是强类型,严格的类型检查

在循环线程中创建对象的问题

问题描述 在循环线程中创建对象的问题 我的程序需要无限循环来接受来自Socket的数据,但是在无限循环中需要创建对象来接收数据,可是如果在循环中创建对象就会导致,对象被创建了之后就算是在后面被 object = null:了也是不会被回收,只会越堆越多 最后将程序UI卡住,请问 这个问题该怎么解决啊~~ 解决方案 问题当中没有详细说明使用什么语言,但是如果是C++使用new操作符和delete操作符是可以在特定的作用域中自由创建和销毁对象的.因为你想在循环体内部创建对象,所以不能使用在循环体内定

android将Bitmap对象保存到SD卡中的方法

  android将Bitmap对象保存到SD卡中的方法          这篇文章主要介绍了android将Bitmap对象保存到SD卡中的方法,涉及Android读写SD卡数据的方法,需要的朋友可以参考下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 Bitmap logoBitmap = BitmapFactory.decodeResourc

js中创建对象的几种方式示例介绍

 JavaScript中的所有事物都是对象,本文为大家介绍下JS中创建对象的几种方式,如原始方法.工厂方法等等 JavaScript中的所有事物都是对象:字符串.数组.数值.函数等.JS中并没有类的概念,    但我们可以利用JS的语法特征,以类的思想来创建对象.    原始方法   代码如下: <script type="text/javascript">    var obj = new Object();  obj.name = "Koji"; /

c++-在类中使用单链表,对象该怎么放到节点中?

问题描述 在类中使用单链表,对象该怎么放到节点中? 我用的是基本的单链表思想,Student是我的类,我把"Student next:"直接写在Student类里面,但是我不知道怎么把对象放到节点上.这是我写的类的单链表: /*Student *L, *s, *r; L = (Student *) malloc (sizeof(Student)); r = L; s = (Student *) malloc (sizeof(Student)); s->/这里不知道该写什么?*/

Anroid 求解答代码中如何获取到抽象类的对象,从而调用抽象类中的方法。(急)

问题描述 Anroid 求解答代码中如何获取到抽象类的对象,从而调用抽象类中的方法.(急) public abstract class DataSource { protected static DataSource me; public static DataSource getInstance() { if (me == null) {} try { if (me == null) { //下面这一行代码在Application中是空实现 MyApplication.getInstance(

javascript中创建对象的几种方式

原文:javascript中创建对象的几种方式 javascript中提供了通过Object构造函数或对象字面量方式来创建单个的对象,当我们想要创建很多对象的时候,简单的通过这两种方法就会产生大量的重复.在此,我总结了几种创建对象的模式.本文是在我阅读<javascript高级程序设计>后总结而来. 1.工厂模式 这种模式通过用函数来减少代码重复,利用函数的参数作为接口,与对象的属性与方法对接. function createfactory(name,age){ var obj = new O

java中创建对象的步骤是怎么样的?

问题描述 java中创建对象的步骤是怎么样的? 老师说,先new了一个对象,在堆内存中开辟空间 然后就是赋默认值(没有静态代码块) 接着就是调用对应的构造函数进栈. 执行隐藏的步骤. 1:super() 2:对非静态变量进行赋显示值 3:执行构造代码块 最后执行构造函数代码块. 然后构造函数出栈.把地址传递给接受的变量. 解决方案 大家已经说的够多了,估计也听得差不多了.这种问题也只会在面试或者考试出现,实际编程中写成这样,早被打死了.老师说的概念太拗口,这样说你可能会好理解一点,普通的初始化代

详细分析Javascript中创建对象的四种方式_javascript技巧

前言 使用Javascript创建对象的方式有很多,现在就来列举一下其中的四种方式,并且罗列出了每种方式的优缺点,可以让大家进行选择使用,下面来看看. 工厂模式 function createPerson(name, age){ var obj = new Object(); obj.name = name; obj.age = age; return obj; //一定要返回,否则打印undefined:undefined } var person1 = new createPerson('Y